Merge NP21/W rev.71

- [lr] add CPU feature<br>
- fix Sound Blaster 16 (OPL3)<br>
- GamePort on soundboards<br>
This commit is contained in:
AZO234 2020-03-13 14:23:53 +09:00
parent c0fd97acb3
commit 3045b0574d
72 changed files with 3754 additions and 863 deletions

View File

@ -1,5 +1,5 @@
# Neko Project II 0.86 kai
Mar 8, 2020<br>
Mar 13, 2020<br>
NP2kai is PC-9801 series emulator<br>
@ -1025,6 +1025,11 @@ Next boot computer, you command from 4.<br>
</div></details>
## Release
- Mar 13, 2020<br>
- Merge NP21/W rev.71<br>
- [lr] add CPU feature<br>
- fix Sound Blaster 16 (OPL3)<br>
- GamePort on soundboards<br>
- Mar 6, 2020<br>
- [SDL2/X11] fix default.ttf<br>
- Mar 2, 2020<br>

View File

@ -951,10 +951,10 @@ UINT MEMCALL biosfunc(UINT32 adrs) {
bios_screeninit();
if (((pccore.model & PCMODELMASK) >= PCMODEL_VX) &&
(pccore.sound & 0x7e)) {
if(g_nSoundID == SOUNDID_MATE_X_PCM || ((g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118) && np2cfg.snd118irqf == np2cfg.snd118irqp) || g_nSoundID == SOUNDID_PC_9801_86_WSS || g_nSoundID == SOUNDID_WAVESTAR){
if(g_nSoundID == SOUNDID_MATE_X_PCM || ((g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16) && np2cfg.snd118irqf == np2cfg.snd118irqp) || g_nSoundID == SOUNDID_PC_9801_86_WSS || g_nSoundID == SOUNDID_WAVESTAR || g_nSoundID == SOUNDID_PC_9801_86_WSS_SB16){
iocore_out8(0x188, 0x27);
iocore_out8(0x18a, 0x30);
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118){
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
iocore_out8(cs4231.port[4], 0x27);
iocore_out8(cs4231.port[4]+2, 0x30);
}
@ -983,21 +983,23 @@ UINT MEMCALL biosfunc(UINT32 adrs) {
switch(CPU_AH){
case 0x00:
#if defined(SUPPORT_CL_GD5430)
np2wab.relaystateint |= 0x02;
np2wab_setRelayState(0x02);
if(CPU_AL == 0x13){
// MODE X
np2clvga.modex = 1;
np2clvga.VRAMWindowAddr3 = 0xa0000;
np2wab.relaystateext |= 0x02;
np2wab_setRelayState(np2wab.relaystateint|np2wab.relaystateext);
}else{
np2clvga.modex = 0;
np2clvga.VRAMWindowAddr3 = 0;
//np2wab.relaystateext &= ‾0x01;
np2wab_setRelayState(np2wab.relaystateint|np2wab.relaystateext);
}
#endif
break;
case 0x1a:
// XXX: WAB有効の時だけ返す
if(np2wab.relaystateint || np2wab.relaystateext){
if(np2clvga.modex || np2wab.relaystateint || np2wab.relaystateext){
if(CPU_AL==0x00){
CPU_BH = 0x00;
CPU_BL = 0x08;

View File

@ -9,6 +9,8 @@
#include "iocore.h"
#include "cbuscore.h"
#include "cs4231io.h"
#include "joymng.h"
#include "cpucore.h"
#include "sound/fmboard.h"
#include "sound/sound.h"
#include "sound/soundrom.h"
@ -20,8 +22,9 @@ static int a460_soundid = 0x80;
/*********** for OPL (MAME) ***********/
#define G_OPL3_INDEX 0
#ifdef USE_MAME
static void *opl3 = NULL;
static int samplerate;
void *YMF262Init(INT clock, INT rate);
void YMF262ResetChip(void *chip);
@ -32,31 +35,26 @@ void YMF262UpdateOne(void *chip, INT16 **buffer, INT length);
static void IOOUTCALL sb16_o20d2(UINT port, REG8 dat) {
(void)port;
g_opl.addr = dat;
g_opl3.s.addrl = dat; // Key Display用
YMF262Write(opl3, 0, dat);
g_opl3[G_OPL3_INDEX].s.addrl = dat; // Key Display用
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 0, dat);
}
static void IOOUTCALL sb16_o21d2(UINT port, REG8 dat) {
(void)port;
g_opl.reg[g_opl.addr] = dat;
//S98_put(NORMAL2608, g_opl.addr, dat);
opl3_writeRegister(&g_opl3, g_opl3.s.addrl, dat); // Key Display用
YMF262Write(opl3, 1, dat);
opl3_writeRegister(&g_opl3[G_OPL3_INDEX], g_opl3[G_OPL3_INDEX].s.addrl, dat); // Key Display用
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 1, dat);
}
static void IOOUTCALL sb16_o22d2(UINT port, REG8 dat) {
(void)port;
g_opl.addr2 = dat;
g_opl3.s.addrh = dat; // Key Display用
YMF262Write(opl3, 2, dat);
g_opl3[G_OPL3_INDEX].s.addrh = dat; // Key Display用
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 2, dat);
}
static void IOOUTCALL sb16_o23d2(UINT port, REG8 dat) {
(void)port;
g_opl.reg[g_opl.addr2 + 0x100] = dat;
opl3_writeExtendedRegister(&g_opl3, g_opl3.s.addrh, dat); // Key Display用
opl3_writeExtendedRegister(&g_opl3[G_OPL3_INDEX], g_opl3[G_OPL3_INDEX].s.addrh, dat); // Key Display用
//S98_put(EXTEND2608, opl.addr2, dat);
YMF262Write(opl3, 3, dat);
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 3, dat);
}
static void IOOUTCALL sb16_o28d2(UINT port, REG8 dat) {
@ -65,17 +63,17 @@ static void IOOUTCALL sb16_o28d2(UINT port, REG8 dat) {
* UltimaUnderWorldではこちらを叩く
*/
port = dat;
YMF262Write(opl3, 0, dat);
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 0, dat);
}
static void IOOUTCALL sb16_o29d2(UINT port, REG8 dat) {
port = dat;
YMF262Write(opl3, 1, dat);
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 1, dat);
}
static REG8 IOINPCALL sb16_i20d2(UINT port) {
REG8 ret;
ret = YMF262Read(opl3, 0);
ret = YMF262Read(g_mame_opl3[G_OPL3_INDEX], 0);
////if(g_opl.reg[0x4] == 1) return 0x02;
////if(g_opl.reg[0x4] == 1){
// if ((cs4231.reg.pinctrl & IEN) && (cs4231.dmairq != 0xff)) {
@ -88,12 +86,12 @@ static REG8 IOINPCALL sb16_i20d2(UINT port) {
static REG8 IOINPCALL sb16_i22d2(UINT port) {
(void)port;
return YMF262Read(opl3, 1);
return YMF262Read(g_mame_opl3[G_OPL3_INDEX], 1);
}
static REG8 IOINPCALL sb16_i28d2(UINT port) {
(void)port;
return YMF262Read(opl3, 0);
return YMF262Read(g_mame_opl3[G_OPL3_INDEX], 0);
}
#endif
@ -262,7 +260,7 @@ static REG8 IOINPCALL wavestar_i4d2(UINT port)
static REG8 IOINPCALL wss_i881e(UINT port)
{
if(g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_PC_9801_86_WSS){
if(g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16){
int ret = 0x64;
ret |= (cs4231.dmairq-1) << 3;
if((cs4231.dmairq-1)==0x1 || (cs4231.dmairq-1)==0x2){
@ -297,17 +295,137 @@ static REG8 IOINPCALL wss_i548f(UINT port)
else return 0;// from PC-9821Nr166
}
#if defined(SUPPORT_GAMEPORT)
/*********** PC-9801-118 Gameport I/O ***********/
#define GAMEPORT_JOYCOUNTER_MGN2 (gameport_clkmax/100)
//#define GAMEPORT_JOYCOUNTER_MGN (gameport_clkmax/100)
#define GAMEPORT_JOYCOUNTER_TMPCLK 10000000
#if defined(SUPPORT_IA32_HAXM)
static LARGE_INTEGER gameport_qpf;
static int gameport_useqpc = 0;
#endif
static UINT64 gameport_tsc;
static UINT32 gameport_clkmax;
static REG8 gameport_joyflag_base = 0x00;
static REG8 gameport_joyflag = 0x00;
static UINT32 gameport_threshold_x = 0;
static UINT32 gameport_threshold_y = 0;
//UINT32 gameport_timeoutcounter = 0;
//UINT32 gameport_timeoutinterval = 0;
// joyflag bit:0 up
// bit:1 down
// bit:2 left
// bit:3 right
// bit:4 trigger1 (rapid)
// bit:5 trigger2 (rapid)
// bit:6 trigger1
// bit:7 trigger2
//void gameport_timeoutproc(NEVENTITEM item);
static void IOOUTCALL gameport_o1480(UINT port, REG8 dat)
{
REG8 joyflag = joymng_getstat();
gameport_joyflag_base = joyflag;
gameport_joyflag = ((joyflag >> 2) & 0x30) | ((joyflag << 2) & 0xc0) | 0x0f;
#if defined(SUPPORT_IA32_HAXM)
{
LARGE_INTEGER li = {0};
if (QueryPerformanceFrequency(&gameport_qpf)) {
QueryPerformanceCounter(&li);
li.QuadPart = li.QuadPart * GAMEPORT_JOYCOUNTER_TMPCLK / gameport_qpf.QuadPart;
gameport_tsc = li.QuadPart;
gameport_useqpc = 1;
}else{
gameport_tsc = CPU_MSR_TSC;
gameport_useqpc = 0;
}
}
#else
#if defined(USE_TSC)
if(CPU_REMCLOCK > 0){
gameport_tsc = CPU_MSR_TSC - CPU_REMCLOCK * pccore.maxmultiple / pccore.multiple;
}else{
gameport_tsc = CPU_MSR_TSC;
}
#else
gameport_tsc = 0;
#endif
//gameport_clkmax = pccore.baseclock * pccore.maxmultiple / 1000; // とりあえず1msで・・・
//gameport_timeoutcounter = 400;
//gameport_timeoutinterval = gameport_clkmax * 2 / gameport_timeoutcounter;
//nevent_set(NEVENT_CDWAIT, gameport_timeoutinterval, gameport_timeoutproc, NEVENT_ABSOLUTE);
#endif
(void)port;
}
//void gameport_timeoutproc(NEVENTITEM item) {
// if(gameport_timeoutcounter > 0){
// gameport_timeoutcounter--;
// nevent_set(NEVENT_CDWAIT, gameport_timeoutinterval, gameport_timeoutproc, NEVENT_ABSOLUTE);
// }
//}
static REG8 IOINPCALL gameport_i1480(UINT port)
{
UINT64 clockdiff;
#if defined(SUPPORT_IA32_HAXM)
if(gameport_useqpc){
LARGE_INTEGER li = {0};
QueryPerformanceCounter(&li);
li.QuadPart = li.QuadPart * GAMEPORT_JOYCOUNTER_TMPCLK / gameport_qpf.QuadPart;
clockdiff = (unsigned long long)li.QuadPart - gameport_tsc;
gameport_clkmax = GAMEPORT_JOYCOUNTER_TMPCLK/2000; // とりあえず0.5msで・・・
}else{
clockdiff = CPU_MSR_TSC - gameport_tsc;
gameport_clkmax = pccore.realclock/2000; // とりあえず0.5msで・・・
}
#else
#if defined(USE_TSC)
if(CPU_REMCLOCK > 0){
clockdiff = CPU_MSR_TSC - CPU_REMCLOCK * pccore.maxmultiple / pccore.multiple - gameport_tsc;
}else{
clockdiff = CPU_MSR_TSC - gameport_tsc;
}
gameport_clkmax = pccore.baseclock * pccore.maxmultiple / 2000; // とりあえず0.5msで・・・
#else
gameport_clkmax = 32;
clockdiff = gameport_tsc;
gameport_tsc++;
#endif
#endif
gameport_threshold_x = gameport_clkmax / 2;
gameport_threshold_y = gameport_clkmax / 2;
if(~gameport_joyflag_base & 0x1){
gameport_threshold_y = GAMEPORT_JOYCOUNTER_MGN2;
}
if(~gameport_joyflag_base & 0x2){
gameport_threshold_y = GAMEPORT_JOYCOUNTER_MGN2 + gameport_clkmax;
}
if(~gameport_joyflag_base & 0x4){
gameport_threshold_x = GAMEPORT_JOYCOUNTER_MGN2;
}
if(~gameport_joyflag_base & 0x8){
gameport_threshold_x = GAMEPORT_JOYCOUNTER_MGN2 + gameport_clkmax;
}
if(clockdiff >= (UINT64)gameport_threshold_x){
gameport_joyflag &= ~0x01;
}
if(clockdiff >= (UINT64)gameport_threshold_y){
gameport_joyflag &= ~0x02;
}
return gameport_joyflag;
}
#endif
/*********** for OPL (NP2) ***********/
static void IOOUTCALL ym_o1488(UINT port, REG8 dat) //FM Music Register Address Port
{
g_opl3.s.addrl = dat;
g_opl3[G_OPL3_INDEX].s.addrl = dat;
(void)port;
}
REG8 opl_data;
static void IOOUTCALL ym_o1489(UINT port, REG8 dat) //FM Music Data Port
{
opl3_writeRegister(&g_opl3, g_opl3.s.addrl, dat);
opl3_writeRegister(&g_opl3[G_OPL3_INDEX], g_opl3[G_OPL3_INDEX].s.addrl, dat);
opl_data = dat;
(void)port;
}
@ -315,12 +433,12 @@ static void IOOUTCALL ym_o1489(UINT port, REG8 dat) //FM Music Data Port
static void IOOUTCALL ym_o148a(UINT port, REG8 dat) // Advanced FM Music Register Address Port
{
g_opl3.s.addrh = dat;
g_opl3[G_OPL3_INDEX].s.addrh = dat;
(void)port;
}
static void IOOUTCALL ym_o148b(UINT port, REG8 dat) //Advanced FM Music Data Port
{
opl3_writeExtendedRegister(&g_opl3, g_opl3.s.addrh, dat);
opl3_writeExtendedRegister(&g_opl3[G_OPL3_INDEX], g_opl3[G_OPL3_INDEX].s.addrh, dat);
(void)port;
}
@ -335,18 +453,18 @@ static REG8 IOINPCALL ym_i1488(UINT port) //FM Music Status Port
static REG8 IOINPCALL ym_i1489(UINT port) // ???
{
TRACEOUT(("%x read",port));
return opl3_readRegister(&g_opl3, g_opl3.s.addrl);
return opl3_readRegister(&g_opl3[G_OPL3_INDEX], g_opl3[G_OPL3_INDEX].s.addrl);
}
static REG8 IOINPCALL ym_i148a(UINT port) //Advanced FM Music Status Port
{
TRACEOUT(("%x read",port));
return opl3_readStatus(&g_opl3);
return opl3_readStatus(&g_opl3[G_OPL3_INDEX]);
}
static REG8 IOINPCALL ym_i148b(UINT port) // ???
{
TRACEOUT(("%x read",port));
return opl3_readExtendedRegister(&g_opl3, g_opl3.s.addrh);
return opl3_readExtendedRegister(&g_opl3[G_OPL3_INDEX], g_opl3[G_OPL3_INDEX].s.addrh);
}
/*********** PC-9801-118 config I/O ? ***********/
@ -410,7 +528,7 @@ static SINT32 oplfm_softvolume_L = 0;
static SINT32 oplfm_softvolume_R = 0;
static SINT32 oplfm_softvolumereg_L = 0xff;
static SINT32 oplfm_softvolumereg_R = 0xff;
void SOUNDCALL opl3gen_getpcm2(void* opl3, SINT32 *pcm, UINT count) {
static void SOUNDCALL opl3gen_getpcm2(void* opl3, SINT32 *pcm, UINT count) {
UINT i;
INT16 *buf[4];
INT16 s1l,s1r,s2l,s2r;
@ -467,7 +585,7 @@ void board118_reset(const NP2CFG *pConfig)
{
// 86音源と共存させる場合、使用するNP2 OPNA番号を変える
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_WAVESTAR){
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_WAVESTAR || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_118_SB16){
opna_idx = 1;
}else{
opna_idx = 0;
@ -475,14 +593,14 @@ void board118_reset(const NP2CFG *pConfig)
// OPNAリセット
opna_reset(&g_opna[opna_idx], OPNA_MODE_2608 | OPNA_HAS_TIMER | OPNA_S98);
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM){
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16){
// OPNAタイマーをセットしない
//opna_timer(&g_opna[opna_idx], 0x10, NEVENT_FMTIMERA, NEVENT_FMTIMERB);
}else{
// OPNAタイマーをセット
UINT irqval = 0x00;
UINT8 irqf = np2cfg.snd118irqf;
if(g_nSoundID==SOUNDID_PC_9801_86_118){
if(g_nSoundID==SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_PC_9801_86_118_SB16){
UINT8 irq86table[4] = {0x03, 0x0d, 0x0a, 0x0c};
UINT8 nIrq86 = (np2cfg.snd86opt & 0x10) | ((np2cfg.snd86opt & 0x4) << 5) | ((np2cfg.snd86opt & 0x8) << 3);
UINT8 irq86 = irq86table[nIrq86 >> 6];
@ -516,7 +634,7 @@ void board118_reset(const NP2CFG *pConfig)
}
// OPLリセット
opl3_reset(&g_opl3, OPL3_HAS_OPL3L|OPL3_HAS_OPL3);
opl3_reset(&g_opl3[G_OPL3_INDEX], OPL3_HAS_OPL3L|OPL3_HAS_OPL3);
opngen_setcfg(&g_opna[opna_idx].opngen, 3, OPN_STEREO | 0x038);
}
@ -524,7 +642,7 @@ void board118_reset(const NP2CFG *pConfig)
cs4231io_reset();
// 86+118の場合、被らないように修正
if(g_nSoundID==SOUNDID_PC_9801_86_118){
if(g_nSoundID==SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_PC_9801_86_118_SB16){
UINT16 snd86iobase = (pConfig->snd86opt & 0x01) ? 0x000 : 0x100;
if(np2cfg.snd118io == 0x188 + snd86iobase){
cs4231.port[4] += 0x100;
@ -532,31 +650,30 @@ void board118_reset(const NP2CFG *pConfig)
}
// 86音源+118音源の場合、118側をはじめからFM6音にする
if(g_nSoundID==SOUNDID_PC_9801_86_118){
if(g_nSoundID==SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_PC_9801_86_118_SB16){
cs4231.extfunc |= 1;
extendchannel(1);
}
// 色々設定
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM){
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16){
}else{
if(pConfig->snd118rom && g_nSoundID!=SOUNDID_PC_9801_86_118){
if(pConfig->snd118rom && g_nSoundID!=SOUNDID_PC_9801_86_118 && g_nSoundID!=SOUNDID_PC_9801_86_118_SB16){
soundrom_load(0xcc000, OEMTEXT("118"));
}
fmboard_extreg(extendchannel);
#ifdef SUPPORT_SOUND_SB16
#ifdef USE_MAME
if (opl3) {
if (g_mame_opl3[G_OPL3_INDEX]) {
if (samplerate != pConfig->samplingrate) {
YMF262Shutdown(opl3);
opl3 = YMF262Init(14400000, pConfig->samplingrate);
YMF262Shutdown(g_mame_opl3[G_OPL3_INDEX]);
g_mame_opl3[G_OPL3_INDEX] = YMF262Init(14400000, pConfig->samplingrate);
samplerate = pConfig->samplingrate;
} else {
YMF262ResetChip(opl3);
YMF262ResetChip(g_mame_opl3[G_OPL3_INDEX]);
}
}
//ZeroMemory(&g_sb16, sizeof(g_sb16));
ZeroMemory(&g_opl, sizeof(g_opl));
//// ボードデフォルト IO:D2 DMA:3 INT:5
//g_sb16.base = 0xd2;
//g_sb16.dmach = 0x3;
@ -590,17 +707,19 @@ void board118_reset(const NP2CFG *pConfig)
*/
void board118_bind(void)
{
int i;
// CS4231バインドI/Oポート割り当てとか
cs4231io_bind();
// 86音源と共存させる場合、使用するNP2 OPNA番号を変える
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_WAVESTAR){
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_WAVESTAR || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_118_SB16){
opna_idx = 1;
}else{
opna_idx = 0;
}
if(g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_PC_9801_86_WSS){
if(g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16){
a460_soundid = np2cfg.sndwssid;//0x70;
}else if(g_nSoundID==SOUNDID_WAVESTAR){
a460_soundid = 0x41;
@ -608,7 +727,7 @@ void board118_bind(void)
a460_soundid = np2cfg.snd118id;//0x80;
}
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_WAVESTAR){
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_WAVESTAR || g_nSoundID==SOUNDID_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16){
// Mate-X PCMの場合、CS4231だけ
if(g_nSoundID!=SOUNDID_WAVESTAR){
iocore_attachout(cs4231.port[1], ymf_oa460);
@ -623,6 +742,16 @@ void board118_bind(void)
opna_bind(&g_opna[opna_idx]);
cbuscore_attachsndex(cs4231.port[4],ymf_o, ymf_i);
}
#if defined(SUPPORT_GAMEPORT)
// ゲームポート割り当て 1480h1487hどこでも良いらしい
if(np2cfg.gameport){
for(i=0;i<=7;i++){
iocore_attachout(0x1480+i, gameport_o1480);
iocore_attachinp(0x1480+i, gameport_i1480);
}
}
#endif
// OPL割り当て
#ifdef USE_MAME
@ -633,11 +762,11 @@ void board118_bind(void)
iocore_attachinp(cs4231.port[9]+2, sb16_i22d2);
iocore_attachout(cs4231.port[9]+3, sb16_o23d2);
if (!opl3) {
opl3 = YMF262Init(14400000, np2cfg.samplingrate);
if (!g_mame_opl3[G_OPL3_INDEX]) {
g_mame_opl3[G_OPL3_INDEX] = YMF262Init(14400000, np2cfg.samplingrate);
samplerate = np2cfg.samplingrate;
}
sound_streamregist(opl3, (SOUNDCB)opl3gen_getpcm2);
sound_streamregist(g_mame_opl3[G_OPL3_INDEX], (SOUNDCB)opl3gen_getpcm2);
#else
iocore_attachout(cs4231.port[9], ym_o1488);
iocore_attachinp(cs4231.port[9], ym_i1488);
@ -645,7 +774,7 @@ void board118_bind(void)
iocore_attachout(cs4231.port[9]+2, ym_o148a);
iocore_attachout(cs4231.port[9]+3, ym_o148b);
#endif
opl3_bind(&g_opl3); // MAME使用の場合Key Display用
opl3_bind(&g_opl3[G_OPL3_INDEX]); // MAME使用の場合Key Display用
// Sound ID I/O port割り当て
iocore_attachout(cs4231.port[1], ymf_oa460);
@ -690,7 +819,7 @@ void board118_unbind(void)
{
cs4231io_unbind();
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_WAVESTAR){
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_WAVESTAR || g_nSoundID==SOUNDID_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16){
// Mate-X PCMの場合、CS4231だけ
iocore_detachout(cs4231.port[1]);
iocore_detachinp(cs4231.port[1]);
@ -703,6 +832,17 @@ void board118_unbind(void)
cbuscore_detachsndex(cs4231.port[4]);
}
#if defined(SUPPORT_GAMEPORT)
// ゲームポート割り当て 1480h1487hどこでも良いらしい
if(np2cfg.gameport){
int i;
for(i=0;i<=7;i++){
iocore_detachout(0x1480+i);
iocore_detachinp(0x1480+i);
}
}
#endif
// OPL割り当て
iocore_detachout(cs4231.port[9]);
iocore_detachinp(cs4231.port[9]);
@ -744,9 +884,9 @@ void board118_unbind(void)
void board118_finalize(void)
{
#ifdef USE_MAME
if (opl3) {
YMF262Shutdown(opl3);
opl3 = NULL;
if (g_mame_opl3[G_OPL3_INDEX]) {
YMF262Shutdown(g_mame_opl3[G_OPL3_INDEX]);
g_mame_opl3[G_OPL3_INDEX] = NULL;
}
#endif
}

View File

@ -7,8 +7,34 @@
#include "ct1741io.h"
#include "ct1745io.h"
#include "fmboard.h"
#include "mpu98ii.h"
#include "smpu98.h"
#include "joymng.h"
#include "cpucore.h"
//#include "s98.h"
#include <math.h>
#if 0
#undef TRACEOUT
#define USE_TRACEOUT_VS
#ifdef USE_TRACEOUT_VS
static void trace_fmt_ex(const char *fmt, ...)
{
char stmp[2048];
va_list ap;
va_start(ap, fmt);
vsprintf(stmp, fmt, ap);
strcat(stmp, "¥n");
va_end(ap);
OutputDebugStringA(stmp);
}
#define TRACEOUT(s) trace_fmt_ex s
#else
#define TRACEOUT(s) (void)(s)
#endif
#endif /* 1 */
#ifdef SUPPORT_SOUND_SB16
/**
@ -18,10 +44,15 @@
* IO:D2 DMA:3 INT:5
*/
static void *opl3 = NULL;
#define G_OPL3_INDEX 1
static const UINT8 sb16base[] = {0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde};
static int samplerate;
static UINT8 seq[] = {0x60, 0x80, 0xff, 0x21}; // XXX: Win2kドライバのチェックを通すためだけの暫定シーケンス
static int forceopl3mode = 0;
static int seqpos = 0;
#ifdef USE_MAME
void *YMF262Init(INT clock, INT rate);
void YMF262ResetChip(void *chip);
@ -46,49 +77,75 @@ static void IOOUTCALL sb16_o0700(UINT port, REG8 dat) {
static void IOOUTCALL sb16_o8000(UINT port, REG8 dat) {
/* MIDI Data Port */
// TRACEOUT(("SB16-midi commands: %.2x", dat));
//if(g_sb16.dsp_info.uartmode){
if(mpu98.enable){
mpu98.mode = 1; // force set UART mode
mpu98ii_o0(port, dat);
}else if(smpu98.enable){
smpu98.mode = 1; // force set UART mode
smpu98_o0(port, dat);
}
//}
port = dat;
}
static void IOOUTCALL sb16_o8100(UINT port, REG8 dat) {
/* MIDI Stat Port */
// TRACEOUT(("SB16-midi status: %.2x", dat));
//if(g_sb16.dsp_info.uartmode){
if(mpu98.enable){
mpu98.mode = 1; // force set UART mode
mpu98ii_o2(port, dat);
}else if(smpu98.enable){
smpu98.mode = 1; // force set UART mode
smpu98_o2(port, dat);
}
//}
TRACEOUT(("MPU PORT=0x%04x, DATA=0x%02x", port, dat));
port = dat;
}
static void IOOUTCALL sb16_o2000(UINT port, REG8 dat) {
(void)port;
g_opl.addr = dat;
#ifdef USE_MAME
YMF262Write(opl3, 0, dat);
g_opl3.s.addrl = dat; // Key Display用
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 0, dat);
g_opl3[G_OPL3_INDEX].s.addrl = dat; // Key Display用
#endif
//TRACEOUT(("OPL3 PORT=0x%04x, DATA=0x%02x", port, dat));
}
static void IOOUTCALL sb16_o2100(UINT port, REG8 dat) {
(void)port;
g_opl.reg[g_opl.addr] = dat;
//S98_put(NORMAL2608, g_opl.addr, dat);
#ifdef USE_MAME
YMF262Write(opl3, 1, dat);
opl3_writeRegister(&g_opl3, g_opl3.s.addrl, dat); // Key Display用
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 1, dat);
opl3_writeRegister(&g_opl3[G_OPL3_INDEX], g_opl3[G_OPL3_INDEX].s.addrl, dat); // Key Display用
#endif
if(g_opl3[G_OPL3_INDEX].s.addrl==2 || g_opl3[G_OPL3_INDEX].s.addrl==4){
if(seqpos < sizeof(seq) && seq[seqpos]==dat){
seqpos++;
}else if(seq[0]==dat){
seqpos = 1;
}else{
seqpos = 0;
}
}
//TRACEOUT(("OPL3 PORT=0x%04x, DATA=0x%02x", port, dat));
}
static void IOOUTCALL sb16_o2200(UINT port, REG8 dat) {
(void)port;
g_opl.addr2 = dat;
#ifdef USE_MAME
YMF262Write(opl3, 2, dat);
g_opl3.s.addrh = dat; // Key Display用
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 2, dat);
g_opl3[G_OPL3_INDEX].s.addrh = dat; // Key Display用
#endif
//TRACEOUT(("OPL3 PORT=0x%04x, DATA=0x%02x", port, dat));
}
static void IOOUTCALL sb16_o2300(UINT port, REG8 dat) {
(void)port;
g_opl.reg[g_opl.addr2 + 0x100] = dat;
//S98_put(EXTEND2608, opl.addr2, dat);
#ifdef USE_MAME
YMF262Write(opl3, 3, dat);
opl3_writeExtendedRegister(&g_opl3, g_opl3.s.addrh, dat); // Key Display用
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 3, dat);
opl3_writeExtendedRegister(&g_opl3[G_OPL3_INDEX], g_opl3[G_OPL3_INDEX].s.addrh, dat); // Key Display用
#endif
//TRACEOUT(("OPL3 PORT=0x%04x, DATA=0x%02x", port, dat));
}
static void IOOUTCALL sb16_o2800(UINT port, REG8 dat) {
@ -98,13 +155,13 @@ static void IOOUTCALL sb16_o2800(UINT port, REG8 dat) {
*/
port = dat;
#ifdef USE_MAME
YMF262Write(opl3, 0, dat);
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 0, dat);
#endif
}
static void IOOUTCALL sb16_o2900(UINT port, REG8 dat) {
port = dat;
#ifdef USE_MAME
YMF262Write(opl3, 1, dat);
YMF262Write(g_mame_opl3[G_OPL3_INDEX], 1, dat);
#endif
}
@ -122,18 +179,42 @@ static REG8 IOINPCALL sb16_i0700(UINT port) {
}
static REG8 IOINPCALL sb16_i8000(UINT port) {
/* Midi Port */
//if(g_sb16.dsp_info.uartmode){
if(mpu98.enable){
mpu98.mode = 1; // force set UART mode
return mpu98ii_i0(port);
}else if(smpu98.enable){
smpu98.mode = 1; // force set UART mode
return smpu98_i0(port);
}
//}
return 0;
}
static REG8 IOINPCALL sb16_i8100(UINT port) {
/* Midi Port */
return 0;
//if(g_sb16.dsp_info.uartmode){
TRACEOUT(("MPU PORT=0x%04x", port));
if(mpu98.enable){
mpu98.mode = 1; // force set UART mode
return mpu98ii_i2(port) & ~0x40; // 強制Ready
}else if(smpu98.enable){
smpu98.mode = 1; // force set UART mode
return smpu98_i2(port) & ~0x40; // 強制Ready
}
//}
return 0x00;
}
static REG8 IOINPCALL sb16_i2000(UINT port) {
(void)port;
//TRACEOUT(("OPL3 PORT=0x%04x", port));
#ifdef USE_MAME
return YMF262Read(opl3, 0);
if(!forceopl3mode && seqpos == sizeof(seq)){
return 0xC0;
}else{
return YMF262Read(g_mame_opl3[G_OPL3_INDEX], 0);
}
#else
return 0;
#endif
@ -141,8 +222,9 @@ static REG8 IOINPCALL sb16_i2000(UINT port) {
static REG8 IOINPCALL sb16_i2200(UINT port) {
(void)port;
//TRACEOUT(("OPL3 PORT=0x%04x", port));
#ifdef USE_MAME
return YMF262Read(opl3, 1);
return YMF262Read(g_mame_opl3[G_OPL3_INDEX], 1);
#else
return 0;
#endif
@ -150,21 +232,143 @@ static REG8 IOINPCALL sb16_i2200(UINT port) {
static REG8 IOINPCALL sb16_i2800(UINT port) {
(void)port;
//TRACEOUT(("OPL3 PORT=0x%04x", port));
#ifdef USE_MAME
return YMF262Read(opl3, 0);
return YMF262Read(g_mame_opl3[G_OPL3_INDEX], 0);
#else
return 0;
#endif
}
#if defined(SUPPORT_GAMEPORT)
/*********** Sound Blaster 16 Gameport I/O ***********/
#define GAMEPORT_JOYCOUNTER_MGN2 (gameport_clkmax/100)
//#define GAMEPORT_JOYCOUNTER_MGN (gameport_clkmax/100)
#define GAMEPORT_JOYCOUNTER_TMPCLK 10000000
#if defined(SUPPORT_IA32_HAXM)
static LARGE_INTEGER gameport_qpf;
static int gameport_useqpc = 0;
#endif
static UINT64 gameport_tsc;
static UINT32 gameport_clkmax;
static REG8 gameport_joyflag_base = 0x00;
static REG8 gameport_joyflag = 0x00;
static UINT32 gameport_threshold_x = 0;
static UINT32 gameport_threshold_y = 0;
//UINT32 gameport_timeoutcounter = 0;
//UINT32 gameport_timeoutinterval = 0;
// joyflag bit:0 up
// bit:1 down
// bit:2 left
// bit:3 right
// bit:4 trigger1 (rapid)
// bit:5 trigger2 (rapid)
// bit:6 trigger1
// bit:7 trigger2
//void gameport_timeoutproc(NEVENTITEM item);
static void IOOUTCALL gameport_o4d2(UINT port, REG8 dat)
{
REG8 joyflag = joymng_getstat();
gameport_joyflag_base = joyflag;
gameport_joyflag = ((joyflag >> 2) & 0x30) | ((joyflag << 2) & 0xc0) | 0x0f;
#if defined(SUPPORT_IA32_HAXM)
{
LARGE_INTEGER li = {0};
if (QueryPerformanceFrequency(&gameport_qpf)) {
QueryPerformanceCounter(&li);
li.QuadPart = li.QuadPart * GAMEPORT_JOYCOUNTER_TMPCLK / gameport_qpf.QuadPart;
gameport_tsc = li.QuadPart;
gameport_useqpc = 1;
}else{
gameport_tsc = CPU_MSR_TSC;
gameport_useqpc = 0;
}
}
#else
#if defined(USE_TSC)
if(CPU_REMCLOCK > 0){
gameport_tsc = CPU_MSR_TSC - CPU_REMCLOCK * pccore.maxmultiple / pccore.multiple;
}else{
gameport_tsc = CPU_MSR_TSC;
}
#else
gameport_tsc = 0;
#endif
//gameport_clkmax = pccore.baseclock * pccore.maxmultiple / 1000; // とりあえず1msで・・・
//gameport_timeoutcounter = 400;
//gameport_timeoutinterval = gameport_clkmax * 2 / gameport_timeoutcounter;
//nevent_set(NEVENT_CDWAIT, gameport_timeoutinterval, gameport_timeoutproc, NEVENT_ABSOLUTE);
#endif
(void)port;
}
//void gameport_timeoutproc(NEVENTITEM item) {
// if(gameport_timeoutcounter > 0){
// gameport_timeoutcounter--;
// nevent_set(NEVENT_CDWAIT, gameport_timeoutinterval, gameport_timeoutproc, NEVENT_ABSOLUTE);
// }
//}
static REG8 IOINPCALL gameport_i4d2(UINT port)
{
UINT64 clockdiff;
#if defined(SUPPORT_IA32_HAXM)
if(gameport_useqpc){
LARGE_INTEGER li = {0};
QueryPerformanceCounter(&li);
li.QuadPart = li.QuadPart * GAMEPORT_JOYCOUNTER_TMPCLK / gameport_qpf.QuadPart;
clockdiff = (unsigned long long)li.QuadPart - gameport_tsc;
gameport_clkmax = GAMEPORT_JOYCOUNTER_TMPCLK/2000; // とりあえず0.5msで・・・
}else{
clockdiff = CPU_MSR_TSC - gameport_tsc;
gameport_clkmax = pccore.realclock/2000; // とりあえず0.5msで・・・
}
#else
#if defined(USE_TSC)
if(CPU_REMCLOCK > 0){
clockdiff = CPU_MSR_TSC - CPU_REMCLOCK * pccore.maxmultiple / pccore.multiple - gameport_tsc;
}else{
clockdiff = CPU_MSR_TSC - gameport_tsc;
}
gameport_clkmax = pccore.baseclock * pccore.maxmultiple / 2000; // とりあえず0.5msで・・・
#else
gameport_clkmax = 32;
clockdiff = gameport_tsc;
gameport_tsc++;
#endif
#endif
gameport_threshold_x = gameport_clkmax / 2;
gameport_threshold_y = gameport_clkmax / 2;
if(gameport_joyflag_base & 0x1){
gameport_threshold_y = GAMEPORT_JOYCOUNTER_MGN2;
}
if(gameport_joyflag_base & 0x2){
gameport_threshold_y = GAMEPORT_JOYCOUNTER_MGN2 + gameport_clkmax;
}
if(gameport_joyflag_base & 0x4){
gameport_threshold_x = GAMEPORT_JOYCOUNTER_MGN2;
}
if(gameport_joyflag_base & 0x8){
gameport_threshold_x = GAMEPORT_JOYCOUNTER_MGN2 + gameport_clkmax;
}
if(clockdiff >= (UINT64)gameport_threshold_x){
gameport_joyflag &= 0x01;
}
if(clockdiff >= (UINT64)gameport_threshold_y){
gameport_joyflag &= 0x02;
}
return gameport_joyflag;
}
#endif
// ----
void SOUNDCALL opl3gen_getpcm(void* opl3, SINT32 *pcm, UINT count) {
static void SOUNDCALL opl3gen_getpcm(void* opl3, SINT32 *pcm, UINT count) {
UINT i;
INT16 *buf[4];
INT16 s1l,s1r,s2l,s2r;
SINT32 *outbuf = pcm;
SINT32 oplfm_volume;
SINT32 midivolL = g_sb16.mixregexp[MIXER_MIDI_LEFT];
SINT32 midivolR = g_sb16.mixregexp[MIXER_MIDI_RIGHT];
oplfm_volume = np2cfg.vol_fm;
buf[0] = &s1l;
buf[1] = &s1r;
@ -175,38 +379,43 @@ void SOUNDCALL opl3gen_getpcm(void* opl3, SINT32 *pcm, UINT count) {
#ifdef USE_MAME
YMF262UpdateOne(opl3, buf, 1);
#endif
outbuf[0] += (SINT32)(((s1l << 1) * oplfm_volume) >> 5);
outbuf[1] += (SINT32)(((s1r << 1) * oplfm_volume) >> 5);
outbuf[0] += (SINT32)(((s1l << 1) * oplfm_volume * midivolL / 255 * (SINT32)g_sb16.mixregexp[MIXER_MASTER_LEFT] / 255) >> 6);
outbuf[1] += (SINT32)(((s1r << 1) * oplfm_volume * midivolR / 255 * (SINT32)g_sb16.mixregexp[MIXER_MASTER_RIGHT] / 255) >> 6);
outbuf += 2;
}
}
void boardsb16_reset(const NP2CFG *pConfig) {
if (opl3) {
DSP_INFO olddsp;
if (g_mame_opl3[G_OPL3_INDEX]) {
if (samplerate != pConfig->samplingrate) {
#ifdef USE_MAME
YMF262Shutdown(opl3);
opl3 = YMF262Init(14400000, pConfig->samplingrate);
YMF262Shutdown(g_mame_opl3[G_OPL3_INDEX]);
g_mame_opl3[G_OPL3_INDEX] = YMF262Init(14400000, pConfig->samplingrate);
#endif
samplerate = pConfig->samplingrate;
} else {
#ifdef USE_MAME
YMF262ResetChip(opl3);
YMF262ResetChip(g_mame_opl3[G_OPL3_INDEX]);
#endif
}
}
olddsp = g_sb16.dsp_info; // dsp_infoだけ初期化しない
ZeroMemory(&g_sb16, sizeof(g_sb16));
ZeroMemory(&g_opl, sizeof(g_opl));
g_sb16.dsp_info = olddsp;
// ボードデフォルト IO:D2 DMA:3 IRQ:5(INT1)
g_sb16.base = np2cfg.sndsb16io; //0xd2;
g_sb16.dmach = np2cfg.sndsb16dma; //0x3;
g_sb16.dmairq = np2cfg.sndsb16irq; //0x5;
ct1745io_reset();
ct1741io_reset();
forceopl3mode = 0;
seqpos = 0;
}
void boardsb16_bind(void) {
opl3_reset(&g_opl3, OPL3_HAS_OPL3L|OPL3_HAS_OPL3);
opl3_reset(&g_opl3[G_OPL3_INDEX], OPL3_HAS_OPL3L|OPL3_HAS_OPL3);
ct1745io_bind();
ct1741io_bind();
@ -221,29 +430,74 @@ void boardsb16_bind(void) {
iocore_attachinp(0x2000 + g_sb16.base, sb16_i2000); /* FM Music Status Port */
iocore_attachinp(0x2200 + g_sb16.base, sb16_i2200); /* Advanced FM Music Status Port */
iocore_attachinp(0x2800 + g_sb16.base, sb16_i2800); /* FM Music Status Port */
#if defined(SUPPORT_GAMEPORT)
iocore_attachout(0x0400 + g_sb16.base, gameport_o4d2); /* GAME Port */
iocore_attachout(0x0500 + g_sb16.base, gameport_o4d2); /* GAME Port */
iocore_attachout(0x0600 + g_sb16.base, gameport_o4d2); /* GAME Port */
iocore_attachout(0x0700 + g_sb16.base, gameport_o4d2); /* GAME Port */
iocore_attachinp(0x0400 + g_sb16.base, gameport_i4d2); /* GAME Port */
iocore_attachinp(0x0500 + g_sb16.base, gameport_i4d2); /* GAME Port */
iocore_attachinp(0x0600 + g_sb16.base, gameport_i4d2); /* GAME Port */
iocore_attachinp(0x0700 + g_sb16.base, gameport_i4d2); /* GAME Port */
#else
iocore_attachout(0x0400 + g_sb16.base, sb16_o0400); /* GAME Port */
iocore_attachout(0x0500 + g_sb16.base, sb16_o0500); /* GAME Port */
iocore_attachout(0x0600 + g_sb16.base, sb16_o0600); /* GAME Port */
iocore_attachout(0x0700 + g_sb16.base, sb16_o0700); /* GAME Port */
iocore_attachout(0x0500 + g_sb16.base, sb16_o0400); /* GAME Port */
iocore_attachout(0x0600 + g_sb16.base, sb16_o0400); /* GAME Port */
iocore_attachout(0x0700 + g_sb16.base, sb16_o0400); /* GAME Port */
iocore_attachinp(0x0400 + g_sb16.base, sb16_i0400); /* GAME Port */
iocore_attachinp(0x0500 + g_sb16.base, sb16_i0500); /* GAME Port */
iocore_attachinp(0x0600 + g_sb16.base, sb16_i0600); /* GAME Port */
iocore_attachinp(0x0700 + g_sb16.base, sb16_i0700); /* GAME Port */
iocore_attachinp(0x0500 + g_sb16.base, sb16_i0400); /* GAME Port */
iocore_attachinp(0x0600 + g_sb16.base, sb16_i0400); /* GAME Port */
iocore_attachinp(0x0700 + g_sb16.base, sb16_i0400); /* GAME Port */
#endif
iocore_attachout(0x8000 + g_sb16.base, sb16_o8000); /* MIDI Port */
//iocore_attachout(0x8001 + g_sb16.base, sb16_o8100); /* MIDI Port 暫定 */
iocore_attachout(0x8100 + g_sb16.base, sb16_o8100); /* MIDI Port */
iocore_attachinp(0x8000 + g_sb16.base, sb16_i8000); /* MIDI Port */
//iocore_attachinp(0x8001 + g_sb16.base, sb16_i8100); /* MIDI Port 暫定 */
iocore_attachinp(0x8100 + g_sb16.base, sb16_i8100); /* MIDI Port */
iocore_attachout(0xC800 + g_sb16.base, sb16_o2000); /* FM Music Register Address Port */
iocore_attachinp(0xC800 + g_sb16.base, sb16_i2000); /* FM Music Status Port */
iocore_attachout(0xC900 + g_sb16.base, sb16_o2100); /* FM Music Data Port */
iocore_attachout(0xCA00 + g_sb16.base, sb16_o2200); /* Advanced FM Music Register Address Port */
iocore_attachinp(0xCA00 + g_sb16.base, sb16_i2200); /* Advanced FM Music Status Port */
iocore_attachout(0xCB00 + g_sb16.base, sb16_o2300); /* Advanced FM Music Data Port */
// PC/AT互換機テスト
if(np2cfg.sndsb16at){
iocore_attachout(0x388, sb16_o2000); /* FM Music Register Address Port */
iocore_attachinp(0x388, sb16_i2000); /* FM Music Status Port */
iocore_attachout(0x389, sb16_o2100); /* FM Music Data Port */
iocore_attachout(0x38a, sb16_o2200); /* Advanced FM Music Register Address Port */
iocore_attachinp(0x38a, sb16_i2200); /* Advanced FM Music Status Port */
iocore_attachout(0x38b, sb16_o2300); /* Advanced FM Music Data Port */
}
if (!opl3) {
if (!g_mame_opl3[G_OPL3_INDEX]) {
#ifdef USE_MAME
opl3 = YMF262Init(14400000, np2cfg.samplingrate);
g_mame_opl3[G_OPL3_INDEX] = YMF262Init(14400000, np2cfg.samplingrate);
#endif
samplerate = np2cfg.samplingrate;
}
sound_streamregist(opl3, (SOUNDCB)opl3gen_getpcm);
opl3_bind(&g_opl3); // MAME使用の場合Key Display用
#if defined(SUPPORT_GAMEPORT)
// ゲームポート割り当て 4d2h
if(np2cfg.gameport){
iocore_attachout(0x0400 + g_sb16.base, gameport_o4d2);
iocore_attachinp(0x0400 + g_sb16.base, gameport_i4d2);
}
#endif
if (!g_mame_opl3[G_OPL3_INDEX]) {
#ifdef USE_MAME
g_mame_opl3[G_OPL3_INDEX] = YMF262Init(14400000, np2cfg.samplingrate);
#endif
samplerate = np2cfg.samplingrate;
}
sound_streamregist(g_mame_opl3[G_OPL3_INDEX], (SOUNDCB)opl3gen_getpcm);
opl3_bind(&g_opl3[G_OPL3_INDEX]); // MAME使用の場合Key Display用
}
void boardsb16_unbind(void) {
ct1745io_unbind();
@ -268,18 +522,45 @@ void boardsb16_unbind(void) {
iocore_detachinp(0x0500 + g_sb16.base); /* GAME Port */
iocore_detachinp(0x0600 + g_sb16.base); /* GAME Port */
iocore_detachinp(0x0700 + g_sb16.base); /* GAME Port */
iocore_detachout(0x8000 + g_sb16.base); /* MIDI Port */
//iocore_detachout(0x8001 + g_sb16.base); /* MIDI Port 暫定 */
iocore_detachout(0x8100 + g_sb16.base); /* MIDI Port */
iocore_detachinp(0x8000 + g_sb16.base); /* MIDI Port */
//iocore_detachinp(0x8001 + g_sb16.base); /* MIDI Port 暫定 */
iocore_detachinp(0x8100 + g_sb16.base); /* MIDI Port */
iocore_detachout(0xC800 + g_sb16.base); /* FM Music Register Address Port */
iocore_detachinp(0xC800 + g_sb16.base); /* FM Music Status Port */
iocore_detachout(0xC900 + g_sb16.base); /* FM Music Data Port */
iocore_detachout(0xCA00 + g_sb16.base); /* Advanced FM Music Register Address Port */
iocore_detachinp(0xCA00 + g_sb16.base); /* Advanced FM Music Status Port */
iocore_detachout(0xCB00 + g_sb16.base); /* Advanced FM Music Data Port */
// PC/AT互換機テスト
if(np2cfg.sndsb16at){
iocore_detachout(0x388); /* FM Music Register Address Port */
iocore_detachinp(0x388); /* FM Music Status Port */
iocore_detachout(0x389); /* FM Music Data Port */
iocore_detachout(0x38a); /* Advanced FM Music Register Address Port */
iocore_detachinp(0x38a); /* Advanced FM Music Status Port */
iocore_detachout(0x38b); /* Advanced FM Music Data Port */
}
#if defined(SUPPORT_GAMEPORT)
// ゲームポート割り当て 4d2h
if(np2cfg.gameport){
iocore_detachout(0x0400 + g_sb16.base);
iocore_detachinp(0x0400 + g_sb16.base);
}
#endif
}
void boardsb16_finalize(void)
{
#ifdef USE_MAME
if (opl3) {
YMF262Shutdown(opl3);
opl3 = NULL;
if (g_mame_opl3[G_OPL3_INDEX]) {
YMF262Shutdown(g_mame_opl3[G_OPL3_INDEX]);
g_mame_opl3[G_OPL3_INDEX] = NULL;
}
#endif
}

View File

@ -11,6 +11,8 @@
#include "sound/sound.h"
#include "sound/soundrom.h"
#define G_OPL3_INDEX 2
static void IOOUTCALL opn_o188(UINT port, REG8 dat)
{
g_opna[0].s.addrl = dat;
@ -52,22 +54,22 @@ static REG8 IOINPCALL opn_i18a(UINT port)
static void IOOUTCALL opl2_o18c(UINT port, REG8 dat)
{
g_opl3.s.addrl = dat;
g_opl3[G_OPL3_INDEX].s.addrl = dat;
}
static void IOOUTCALL opl2_o18e(UINT port, REG8 dat)
{
opl3_writeRegister(&g_opl3, g_opl3.s.addrl, dat);
opl3_writeRegister(&g_opl3[G_OPL3_INDEX], g_opl3[G_OPL3_INDEX].s.addrl, dat);
}
static REG8 IOINPCALL opl2_i18c(UINT port)
{
return opl3_readStatus(&g_opl3);
return opl3_readStatus(&g_opl3[G_OPL3_INDEX]);
}
static REG8 IOINPCALL opl2_i18e(UINT port)
{
return opl3_readRegister(&g_opl3, g_opl3.s.addrl);
return opl3_readRegister(&g_opl3[G_OPL3_INDEX], g_opl3[G_OPL3_INDEX].s.addrl);
}
@ -88,7 +90,7 @@ void boardso_reset(const NP2CFG *pConfig, BOOL v)
{
opna_reset(&g_opna[0], OPNA_MODE_2203 | OPNA_HAS_TIMER | OPNA_S98);
opna_timer(&g_opna[0], (pConfig->snd26opt & 0xc0) | 0x10, NEVENT_FMTIMERA, NEVENT_FMTIMERB);
opl3_reset(&g_opl3, (REG8)((v) ? OPL3_MODE_8950 : OPL3_MODE_3812));
opl3_reset(&g_opl3[G_OPL3_INDEX], (REG8)((v) ? OPL3_MODE_8950 : OPL3_MODE_3812));
opngen_setcfg(&g_opna[0].opngen, 3, 0x00);
soundrom_loadex(pConfig->snd26opt & 7, OEMTEXT("26"));
@ -101,7 +103,7 @@ void boardso_reset(const NP2CFG *pConfig, BOOL v)
void boardso_bind(void)
{
opna_bind(&g_opna[0]);
opl3_bind(&g_opl3);
opl3_bind(&g_opl3[G_OPL3_INDEX]);
cbuscore_attachsndex(0x188 - g_opna[0].s.base, opn_o, opn_i);
}
void boardso_unbind(void)

View File

@ -196,12 +196,12 @@ void cs4231io_reset(void) {
100b101b=
111b= DMAを使用しない
*/
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM){
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16){
sndirq = np2cfg.sndwssirq;
snddma = np2cfg.sndwssdma;
//cs4231.adrs = 0x0a;////0b00 001 010 INT0 DMA1
//cs4231.adrs = 0x22;////0b00 100 010 INT5 DMA1
}else if(g_nSoundID==SOUNDID_PC_9801_86_118){
}else if(g_nSoundID==SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_PC_9801_86_118_SB16){
UINT8 irq86table[4] = {0x03, 0x0d, 0x0a, 0x0c};
UINT8 nIrq86 = (np2cfg.snd86opt & 0x10) | ((np2cfg.snd86opt & 0x4) << 5) | ((np2cfg.snd86opt & 0x8) << 3);
UINT8 irq86 = irq86table[nIrq86 >> 6];
@ -258,7 +258,7 @@ void cs4231io_reset(void) {
cs4231.dmairq = cs4231irq[(cs4231.adrs >> 3) & 7]; // IRQをセット
cs4231.dmach = cs4231dma[cs4231.adrs & 7]; // DMAチャネルをセット
cs4231.port[0] = 0x0f40; //WSS BASE I/O port
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_PC_9801_86_118){
if(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_118_SB16){
cs4231.port[1] = 0xb460; // Sound ID I/O port (A460hは86音源が使うのでB460hに変更)
}else{
cs4231.port[1] = 0xa460; // Sound ID I/O port
@ -287,7 +287,7 @@ void cs4231io_reset(void) {
cs4231.reg.line_r = 0x88;//13
cs4231.reg.reserved1=0x80; //16 from PC-9821Nr166
cs4231.reg.reserved2=0x80; //17 from PC-9821Nr166
if(g_nSoundID==SOUNDID_PC_9801_118 || g_nSoundID==SOUNDID_PC_9801_86_118){
if(g_nSoundID==SOUNDID_PC_9801_118 || g_nSoundID==SOUNDID_PC_9801_86_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
cs4231.reg.chipid =0xa2;//19 from PC-9801-118 CS4231
}else{
cs4231.reg.chipid =0x80;//19 from PC-9821Nr166 YMF715
@ -321,7 +321,7 @@ void cs4231io_bind(void) {
if (cs4231.dmach != 0xff) {
dmac_attach(DMADEV_CS4231, cs4231.dmach); // CS4231のDMAチャネルを割り当て
}
if(!(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM)){
if(!(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16)){
iocore_attachout(0x480, csctrl_o480);
iocore_attachinp(0x480, csctrl_i480);
iocore_attachinp(0x481, csctrl_i481);
@ -352,7 +352,7 @@ void cs4231io_unbind(void) {
if (cs4231.dmach != 0xff) {
dmac_detach(DMADEV_CS4231); // CS4231のDMAチャネルを割り当て
}
if(!(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_WAVESTAR)){
if(!(g_nSoundID==SOUNDID_PC_9801_86_WSS || g_nSoundID==SOUNDID_MATE_X_PCM || g_nSoundID==SOUNDID_WAVESTAR || g_nSoundID==SOUNDID_WSS_SB16 || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16)){
iocore_detachout(0x480);
iocore_detachinp(0x480);
iocore_detachinp(0x481);

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,95 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
enum DSP_STATUS {
DSP_STATUS_NORMAL,
DSP_STATUS_RESET
};
typedef enum {
DSP_DMA_NONE,
DSP_DMA_2,DSP_DMA_3,DSP_DMA_4,DSP_DMA_8,
DSP_DMA_16,DSP_DMA_16_ALIASED,
} DMA_MODES;
typedef enum {
DSP_MODE_NONE,
DSP_MODE_DAC,
DSP_MODE_DMA,
DSP_MODE_DMA_PAUSE,
DSP_MODE_DMA_MASKED
} DSP_MODES;
#define DSP_NO_COMMAND 0
#define SB_SH 14
#define DMA_BUFSIZE 1024
#define DMA_BUFMASK 1023
#define DSP_BUFSIZE 64
typedef struct {
BOOL stereo,sign,autoinit;
DMA_MODES mode;
UINT32 rate,mul;
UINT32 total,left,min;
// unsigned __int64 start;
union {
UINT8 b8[DMA_BUFSIZE];
SINT16 b16[DMA_BUFSIZE];
} buf;
// UINT32 bits;
DMACH chan;
UINT32 remain_size;
UINT bufsize; // サウンド再生用の循環バッファサイズ。データのread/writeは4byte単位16bitステレオの1サンプル単位で行うこと
UINT bufdatas; // = (bufwpos-bufpos)&CS4231_BUFMASK
UINT bufpos; // バッファの読み取り位置。bufwposと一致してもよいが追い越してはいけない
UINT bufwpos; // バッファの書き込み位置。周回遅れのbufposに追いついてはいけない一致も不可
UINT32 pos12;
UINT32 step12;
UINT8 buffer[DMA_BUFSIZE];
UINT32 rate2;
UINT8 lastautoinit;
UINT8 last16mode;
UINT32 laststartcount;
UINT32 laststartaddr;
} DMA_INFO;
typedef struct {
DMA_INFO dma;
UINT8 state;
UINT8 cmd;
UINT8 cmd_len;
UINT8 cmd_in_pos;
UINT8 cmd_in[DSP_BUFSIZE];
struct {
UINT8 data[DSP_BUFSIZE];
UINT32 pos,used;
} in,out;
UINT8 test_register;
UINT32 write_busy;
DSP_MODES mode;
UINT32 freq;
UINT8 dmairq;
UINT8 dmach;
UINT8 cmd_o;
int smpcounter2; // DMA転送開始以降に送られた有効なデータ数の合計
int smpcounter; // DMA転送開始以降に送られたDMAデータ数の合計無効なデータも含む
UINT8 speaker;
UINT8 uartmode;
} DSP_INFO;
extern
void ct1741io_reset();
void ct1741io_bind(void);
void ct1741io_unbind(void);
@ -10,7 +98,9 @@ void ct1741_set_dma_irq(UINT8 irq);
void ct1741_set_dma_ch(UINT8 dmach);
UINT8 ct1741_get_dma_irq();
UINT8 ct1741_get_dma_ch();
void ct1741_initialize(UINT rate);
void ct1741_dma(NEVENTITEM item);
#ifdef __cplusplus
}
#endif

View File

@ -7,6 +7,28 @@
#include "sound.h"
#include "fmboard.h"
#include <math.h>
#if 0
#undef TRACEOUT
#define USE_TRACEOUT_VS
#ifdef USE_TRACEOUT_VS
static void trace_fmt_ex(const char *fmt, ...)
{
char stmp[2048];
va_list ap;
va_start(ap, fmt);
vsprintf(stmp, fmt, ap);
strcat(stmp, "¥n");
va_end(ap);
OutputDebugStringA(stmp);
}
#define TRACEOUT(s) trace_fmt_ex s
#else
#define TRACEOUT(s) (void)(s)
#endif
#endif /* 1 */
#ifdef SUPPORT_SOUND_SB16
/**
@ -16,20 +38,22 @@
static void ct1745_mixer_reset() {
ZeroMemory(g_sb16.mixreg, sizeof(g_sb16.mixreg));
g_sb16.mixreg[MIXER_MASTER_LEFT] =
g_sb16.mixreg[MIXER_MASTER_RIGHT] =
g_sb16.mixreg[MIXER_VOC_LEFT] =
g_sb16.mixreg[MIXER_VOC_RIGHT] =
g_sb16.mixreg[MIXER_MIDI_LEFT] =
g_sb16.mixreg[MIXER_MIDI_RIGHT] = 24;
g_sb16.mixreg[MIXER_OUT_SW] = 0x1f;
g_sb16.mixreg[MIXER_IN_SW_LEFT] = 0x15;
g_sb16.mixreg[MIXER_IN_SW_RIGHT] = 0x0b;
g_sb16.mixregexp[MIXER_MASTER_LEFT] = g_sb16.mixreg[MIXER_MASTER_LEFT] =
g_sb16.mixregexp[MIXER_MASTER_RIGHT] = g_sb16.mixreg[MIXER_MASTER_RIGHT] =
g_sb16.mixregexp[MIXER_VOC_LEFT] = g_sb16.mixreg[MIXER_VOC_LEFT] =
g_sb16.mixregexp[MIXER_VOC_RIGHT] = g_sb16.mixreg[MIXER_VOC_RIGHT] =
g_sb16.mixregexp[MIXER_MIDI_LEFT] = g_sb16.mixreg[MIXER_MIDI_LEFT] =
g_sb16.mixregexp[MIXER_MIDI_RIGHT] = g_sb16.mixreg[MIXER_MIDI_RIGHT] = 0xff;
g_sb16.mixregexp[MIXER_OUT_SW] = g_sb16.mixreg[MIXER_OUT_SW] = 0x1f;
g_sb16.mixregexp[MIXER_IN_SW_LEFT] = g_sb16.mixreg[MIXER_IN_SW_LEFT] = 0x15;
g_sb16.mixregexp[MIXER_IN_SW_RIGHT] = g_sb16.mixreg[MIXER_IN_SW_RIGHT] = 0x0b;
g_sb16.mixregexp[MIXER_TREBLE_LEFT] = g_sb16.mixreg[MIXER_TREBLE_LEFT] =
g_sb16.mixregexp[MIXER_TREBLE_RIGHT] = g_sb16.mixreg[MIXER_TREBLE_RIGHT] =
g_sb16.mixregexp[MIXER_BASS_LEFT] = g_sb16.mixreg[MIXER_BASS_LEFT] =
g_sb16.mixregexp[MIXER_BASS_RIGHT] = g_sb16.mixreg[MIXER_BASS_RIGHT] = 8;
g_sb16.mixregexp[0x82] = g_sb16.mixreg[0x82] = 2<<5;
g_sb16.mixreg[MIXER_TREBLE_LEFT] =
g_sb16.mixreg[MIXER_TREBLE_RIGHT] =
g_sb16.mixreg[MIXER_BASS_LEFT] =
g_sb16.mixreg[MIXER_BASS_RIGHT] = 8;
}
static void IOOUTCALL sb16_o2400(UINT port, REG8 dat) {
@ -37,10 +61,12 @@ static void IOOUTCALL sb16_o2400(UINT port, REG8 dat) {
g_sb16.mixsel = dat;
}
static void IOOUTCALL sb16_o2500(UINT port, REG8 dat) {
//printf("mixer port write %x %x¥n",dat,g_sb16.mixsel);
if (g_sb16.mixsel >= MIXER_VOL_START &&
g_sb16.mixsel <= MIXER_VOL_END) {
g_sb16.mixreg[g_sb16.mixsel] = dat;
g_sb16.mixregexp[g_sb16.mixsel] = (int)(pow(((dat >> 3) & 0x1f) / 32.0, 2) * 255);//(int)(pow(dat / 255.0, 4) * 255);
TRACEOUT(("CT1745 MIXER ID=0x%02x, DATA=0x%02x", g_sb16.mixsel, dat));
return;
}
@ -49,46 +75,84 @@ static void IOOUTCALL sb16_o2500(UINT port, REG8 dat) {
ct1745_mixer_reset();
break;
case 0x04: // Voice volume(old)
g_sb16.mixreg[MIXER_VOC_LEFT] = (dat & 0x0f);
g_sb16.mixreg[MIXER_VOC_RIGHT] = (dat & 0xf0) >> 3;
g_sb16.mixregexp[MIXER_VOC_LEFT] = g_sb16.mixreg[MIXER_VOC_LEFT] = (dat & 0x0f) << 4;
g_sb16.mixregexp[MIXER_VOC_RIGHT] = g_sb16.mixreg[MIXER_VOC_RIGHT] = (dat & 0xf0);
break;
case 0x0a: // Mic volume(old)
g_sb16.mixreg[MIXER_MIC] = dat & 0x7;
g_sb16.mixregexp[MIXER_MIC] = g_sb16.mixreg[MIXER_MIC] = dat & 0x7;
break;
case 0x22: // Master volume(old)
g_sb16.mixreg[MIXER_MASTER_LEFT] = (dat & 0x0f);
g_sb16.mixreg[MIXER_MASTER_RIGHT] = (dat & 0xf0) >> 3;
g_sb16.mixregexp[MIXER_MASTER_LEFT] = g_sb16.mixreg[MIXER_MASTER_LEFT] = (dat & 0x0f) << 4;
g_sb16.mixregexp[MIXER_MASTER_RIGHT] = g_sb16.mixreg[MIXER_MASTER_RIGHT] = (dat & 0xf0);
break;
case 0x26: // MIDI volume(old)
g_sb16.mixreg[MIXER_MIDI_LEFT] = (dat & 0x0f);
g_sb16.mixreg[MIXER_MIDI_RIGHT] = (dat & 0xf0) >> 3;
g_sb16.mixregexp[MIXER_MIDI_LEFT] = g_sb16.mixreg[MIXER_MIDI_LEFT] = (dat & 0x0f) << 4;
g_sb16.mixregexp[MIXER_MIDI_RIGHT] = g_sb16.mixreg[MIXER_MIDI_RIGHT] = (dat & 0xf0);
break;
case 0x28: // CD volume(old)
g_sb16.mixreg[MIXER_CD_LEFT] = (dat & 0x0f);
g_sb16.mixreg[MIXER_CD_RIGHT] = (dat & 0xf0) >> 3;
g_sb16.mixregexp[MIXER_CD_LEFT] = g_sb16.mixreg[MIXER_CD_LEFT] = (dat & 0x0f) << 4;
g_sb16.mixregexp[MIXER_CD_RIGHT] = g_sb16.mixreg[MIXER_CD_RIGHT] = (dat & 0xf0);
break;
case 0x2e: // Line volume(old)
g_sb16.mixreg[MIXER_LINE_LEFT] = (dat & 0x0f);
g_sb16.mixreg[MIXER_LINE_RIGHT] = (dat & 0xff) >> 3;
g_sb16.mixregexp[MIXER_LINE_LEFT] = g_sb16.mixreg[MIXER_LINE_LEFT] = (dat & 0x0f) << 4;
g_sb16.mixregexp[MIXER_LINE_RIGHT] = g_sb16.mixreg[MIXER_LINE_RIGHT] = (dat & 0xff);
case 0x80: // Write irq num
ct1741_set_dma_irq(dat);
TRACEOUT(("CT1745 MIXER SET IRQ ID=0x%02x", dat));
break;
case 0x81: // Write dma num
ct1741_set_dma_ch(dat);
TRACEOUT(("CT1745 MIXER SET DMA ID=0x%02x", dat));
break;
case 0x83:
default:
break;
}
}
static void IOOUTCALL sb16_o2500_AT(UINT port, REG8 dat) {
if(g_sb16.mixsel==0x80){
switch (dat) {
case 1: // IRQ2
// 変換不能
break;
case 2: // IRQ5
dat = 8;
break;
case 4: // IRQ7 (IRQ2)
// 変換不能
break;
case 8: // IRQ10
dat = 2;
break;
}
}else if(g_sb16.mixsel==0x81){
switch (dat) {
case 1: // DMA0
dat = 1;
break;
case 2: // DMA1
// 変換不能
break;
case 4: // NONE
// 変換不能
break;
case 8: // DMA3
dat = 2;
break;
}
}
sb16_o2500(port, dat);
}
static REG8 IOINPCALL sb16_i2400(UINT port) {
return g_sb16.mixsel;
}
static REG8 IOINPCALL sb16_i2500(UINT port) {
//printf("mixer port read %x %x¥n",g_sb16.mixreg[g_sb16.mixsel],g_sb16.mixsel);
if (g_sb16.mixsel >= MIXER_VOL_START && g_sb16.mixsel <= MIXER_VOL_END) {
return g_sb16.mixreg[g_sb16.mixsel - MIXER_VOL_START];
return g_sb16.mixreg[g_sb16.mixsel];
}
switch (g_sb16.mixsel) {
@ -108,12 +172,51 @@ static REG8 IOINPCALL sb16_i2500(UINT port) {
return ct1741_get_dma_irq();
case 0x81: // Read dma num
return ct1741_get_dma_ch();
case 0x82: // Irq pending(98には不要)
case 0x82: // Irq pending(98には不要) diagnose用 他よくわからず
if(g_sb16.mixreg[0x82] == 0x41)return 0x1;
if(g_sb16.mixreg[0x82] == 0x42)return 0x2;
if(g_sb16.mixreg[0x82] == 0x43)return 0x3;
else return 0x40;
default:
break;
}
return 0;
}
static REG8 IOINPCALL sb16_i2500_AT(UINT port) {
REG8 ret = sb16_i2500(port);
if(g_sb16.mixsel==0x80){
switch (ret) {
case 1: // IRQ3
// 変換不能
break;
case 2: // IRQ10
ret = 8;
break;
case 4: // IRQ12
// 変換不能
break;
case 8: // IRQ5
ret = 2;
break;
}
}else if(g_sb16.mixsel==0x81){
switch (ret) {
case 1: // DMA0
ret = 1;
break;
case 2: // DMA3
ret = 8;
break;
case 4: // NONE
// 変換不能
break;
case 8: // NONE
// 変換不能
break;
}
}
return ret;
}
void ct1745io_reset(void)
{
@ -126,6 +229,14 @@ void ct1745io_bind(void)
iocore_attachout(0x2500 + g_sb16.base, sb16_o2500); /* Mixer Chip Data Port */
iocore_attachinp(0x2400 + g_sb16.base, sb16_i2400); /* Mixer Chip Register Address Port */
iocore_attachinp(0x2500 + g_sb16.base, sb16_i2500); /* Mixer Chip Data Port */
// PC/AT互換機テスト
if(np2cfg.sndsb16at){
iocore_attachout(0x224, sb16_o2400); /* Mixer Chip Register Address Port */
iocore_attachout(0x225, sb16_o2500_AT); /* Mixer Chip Data Port */
iocore_attachinp(0x224, sb16_i2400); /* Mixer Chip Register Address Port */
iocore_attachinp(0x225, sb16_i2500_AT); /* Mixer Chip Data Port */
}
}
void ct1745io_unbind(void)
{
@ -133,6 +244,14 @@ void ct1745io_unbind(void)
iocore_detachout(0x2500 + g_sb16.base); /* Mixer Chip Data Port */
iocore_detachinp(0x2400 + g_sb16.base); /* Mixer Chip Register Address Port */
iocore_detachinp(0x2500 + g_sb16.base); /* Mixer Chip Data Port */
// PC/AT互換機テスト
if(np2cfg.sndsb16at){
iocore_detachout(0x224); /* Mixer Chip Register Address Port */
iocore_detachout(0x225); /* Mixer Chip Data Port */
iocore_detachinp(0x224); /* Mixer Chip Register Address Port */
iocore_detachinp(0x225); /* Mixer Chip Data Port */
}
}
#endif
#endif

View File

@ -36,6 +36,7 @@ void ct1745io_reset(void);
void ct1745io_bind(void);
void ct1745io_unbind(void);
#ifdef __cplusplus
}
#endif

View File

@ -1347,21 +1347,21 @@ static SINT32 sampcount2_n = 0;
// samplen_n /= 100;
// samplen_d /= 100;
//}
//if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_MATE_X_PCM || g_nSoundID == SOUNDID_PC_9801_86_WSS || g_nSoundID == SOUNDID_WAVESTAR){
//if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_MATE_X_PCM || g_nSoundID == SOUNDID_PC_9801_86_WSS || g_nSoundID == SOUNDID_WAVESTAR || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
// if(cdda_softvolumereg_L != cs4231.devvolume[0x32]){
// cdda_softvolumereg_L = cs4231.devvolume[0x32];
// if(cdda_softvolumereg_L & 0x80){ // FM L Mute
// if(cdda_softvolumereg_L & 0x80){ // CD L Mute
// cdda_softvolume_L = 0;
// }else{
// cdda_softvolume_L = ((~cdda_softvolumereg_L) & 0x1f); // FM L Volume
// cdda_softvolume_L = ((‾cdda_softvolumereg_L) & 0x1f); // CD L Volume
// }
// }
// if(cdda_softvolumereg_R != cs4231.devvolume[0x33]){
// cdda_softvolumereg_R = cs4231.devvolume[0x33];
// if(cdda_softvolumereg_R & 0x80){ // FM R Mute
// if(cdda_softvolumereg_R & 0x80){ // CD R Mute
// cdda_softvolume_R = 0;
// }else{
// cdda_softvolume_R = ((~cdda_softvolumereg_R) & 0x1f); // FM R Volume
// cdda_softvolume_R = ((‾cdda_softvolumereg_R) & 0x1f); // CD R Volume
// }
// }
//}else{

View File

@ -9,7 +9,25 @@
#include "mpu98ii.h"
#include "fmboard.h"
#if 0
#undef TRACEOUT
#define USE_TRACEOUT_VS
#ifdef USE_TRACEOUT_VS
static void trace_fmt_ex(const char *fmt, ...)
{
char stmp[2048];
va_list ap;
va_start(ap, fmt);
vsprintf(stmp, fmt, ap);
strcat(stmp, "\n");
va_end(ap);
OutputDebugStringA(stmp);
}
#define TRACEOUT(s) trace_fmt_ex s
#else
#define TRACEOUT(s) (void)(s)
#endif
#endif /* 1 */
enum {
MIDI_STOP = 0xfc,
@ -215,6 +233,18 @@ static void mpu98ii_int(void) {
TRACEOUT(("int!"));
pic_setirq(mpu98.irqnum);
//// Sound Blaster 16
//if(g_nSoundID == SOUNDID_SB16 || g_nSoundID == SOUNDID_PC_9801_86_SB16 || g_nSoundID == SOUNDID_WSS_SB16 || g_nSoundID == SOUNDID_PC_9801_86_WSS_SB16 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
// pic_setirq(g_sb16.dmairq);
//}
//// PC-9801-118
//if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
// pic_setirq(10);
//}
//// WaveStar
//if(g_nSoundID == SOUNDID_WAVESTAR){
// pic_setirq(10);
//}
}
static void tr_step(void) {
@ -993,7 +1023,7 @@ TRACEOUT(("mpu98ii out %.4x %.2x", port, dat));
}
REG8 IOINPCALL mpu98ii_i0(UINT port) {
if (cm_mpu98 == NULL) {
cm_mpu98 = commng_create(COMCREATE_MPU98II);
}
@ -1033,16 +1063,17 @@ TRACEOUT(("mpu98ii inp %.4x %.2x", port, mpu98.data));
REG8 IOINPCALL mpu98ii_i2(UINT port) {
REG8 ret;
if (cm_mpu98 == NULL) {
cm_mpu98 = commng_create(COMCREATE_MPU98II);
}
if (cm_mpu98->connect != COMCONNECT_OFF || g_nSoundID == SOUNDID_PC_9801_118) {
if (cm_mpu98->connect != COMCONNECT_OFF || g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16) {
ret = mpu98.status;
if ((mpu98.r.cnt == 0) && (mpu98.intreq == 0)) {
ret |= MIDIIN_AVAIL;
}
// TRACEOUT(("mpu98ii inp %.4x %.2x", port, ret));
TRACEOUT(("mpu98ii inp %.4x %.2x", port, mpu98.data));
return(ret);
}
(void)port;
@ -1091,6 +1122,8 @@ void mpu98ii_bind(void) {
iocore_attachinp(port, mpu98ii_i0);
//iocore_attachout(port+1, mpu98ii_o2);
//iocore_attachinp(port+1, mpu98ii_i2);
//iocore_attachout(port+0x100, mpu98ii_o2);
//iocore_attachinp(port+0x100, mpu98ii_i2);
port |= 2;
iocore_attachout(port, mpu98ii_o2);
iocore_attachinp(port, mpu98ii_i2);
@ -1103,39 +1136,47 @@ void mpu98ii_bind(void) {
iocore_attachinp(0x331, mpu98ii_i2);
}
// PC-9801-118
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118){
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
iocore_attachout(cs4231.port[10], mpu98ii_o0);
iocore_attachinp(cs4231.port[10], mpu98ii_i0);
iocore_attachout(cs4231.port[10]+1, mpu98ii_o2);
iocore_attachinp(cs4231.port[10]+1, mpu98ii_i2);
switch(np2cfg.snd118irqm){
case 10:
mpu98.irqnum = 10;
break;
}
}
// WaveStar
if(g_nSoundID == SOUNDID_WAVESTAR){
//iocore_attachout(cs4231.port[10], mpu98ii_o0);
//iocore_attachinp(cs4231.port[10], mpu98ii_i0);
//iocore_attachout(cs4231.port[10]+1, mpu98ii_o2);
//iocore_attachinp(cs4231.port[10]+1, mpu98ii_i2);
mpu98.irqnum = 10;
}
}
}
//#define MIDIIN_DEBUG
void mpu98ii_callback(void) {
UINT8 data;
#ifdef MIDIIN_DEBUG
static UINT8 testseq[] = {0x90, 0x3C, 0x7F};
static int testseqpos = 0;
static DWORD time = 0;
#endif
if (cm_mpu98) {
while((mpu98.r.cnt < MPU98_RECVBUFS) &&
(cm_mpu98->read(cm_mpu98, &data))) {
(cm_mpu98->read(cm_mpu98, &data)
#ifdef MIDIIN_DEBUG
|| (np2cfg.asynccpu)
#endif
)) {
if (!mpu98.r.cnt) {
mpu98ii_int();
}
#ifdef MIDIIN_DEBUG
data = testseq[testseqpos];
#endif
setrecvdata(data);
#ifdef MIDIIN_DEBUG
if(testseqpos == sizeof(testseq) - 1){
time = GetTickCount();
testseq[1] = rand() & 0x7f;
}
testseqpos = (testseqpos + 1) % sizeof(testseq);
#endif
}
}
}

View File

@ -310,6 +310,21 @@ static void smpu98_int(void) {
TRACEOUT(("int!"));
pic_setirq(smpu98.irqnum);
//if(!mpu98.enable){
// // Sound Blaster 16
// if(g_nSoundID == SOUNDID_SB16 || g_nSoundID == SOUNDID_PC_9801_86_SB16 || g_nSoundID == SOUNDID_WSS_SB16 || g_nSoundID == SOUNDID_PC_9801_86_WSS_SB16 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
// pic_setirq(g_sb16.dmairq);
// }
// // PC-9801-118
// if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
// pic_setirq(10);
// }
// // WaveStar
// if(g_nSoundID == SOUNDID_WAVESTAR){
// pic_setirq(10);
// }
//}
}
static void tr_step(void) {
@ -1172,7 +1187,7 @@ REG8 IOINPCALL smpu98_i2(UINT port) {
cm_smpu98[1] = commng_create(COMCREATE_SMPU98_B);
smpu98.portBready = (cm_smpu98[1]->connect != COMCONNECT_OFF);
}
if ((cm_smpu98[0]->connect != COMCONNECT_OFF) || g_nSoundID == SOUNDID_PC_9801_118) {
if ((cm_smpu98[0]->connect != COMCONNECT_OFF) || g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16) {
ret = smpu98.status;
if ((smpu98.r.cnt == 0) && (smpu98.intreq == 0)) {
@ -1545,40 +1560,22 @@ void smpu98_bind(void) {
iocore_attachinp(0x331, smpu98_i2);
}
// PC-9801-118
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118){
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
iocore_attachout(cs4231.port[10], smpu98_o0);
iocore_attachinp(cs4231.port[10], smpu98_i0);
iocore_attachout(cs4231.port[10]+1, smpu98_o2);
iocore_attachinp(cs4231.port[10]+1, smpu98_i2);
switch(np2cfg.snd118irqm){
case 10:
smpu98.irqnum = 10;
break;
}
}
// WaveStar
if(g_nSoundID == SOUNDID_WAVESTAR){
//iocore_attachout(cs4231.port[10], smpu98_o0);
//iocore_attachinp(cs4231.port[10], smpu98_i0);
//iocore_attachout(cs4231.port[10]+1, smpu98_o2);
//iocore_attachinp(cs4231.port[10]+1, smpu98_i2);
//smpu98.irqnum = 10;
}
}
}else if(!mpu98.enable){
// MPU-PC98IIもS-MPUも無効の時
// PC-9801-118
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118){
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
iocore_attachout(cs4231.port[10], smpu98_o0);
iocore_attachinp(cs4231.port[10], smpu98_i0);
iocore_attachout(cs4231.port[10]+1, smpu98_o2);
iocore_attachinp(cs4231.port[10]+1, smpu98_i2);
switch(np2cfg.snd118irqm){
case 10:
smpu98.irqnum = 10;
break;
}
// NULLで作っておく
cm_smpu98[0] = commng_create(COMCREATE_NULL);
cm_smpu98[1] = commng_create(COMCREATE_NULL);

View File

@ -101,7 +101,7 @@ typedef struct
KDCHANNEL ch[KEYDISP_CHMAX];
OPNACTL opnactl[5]; /*!< OPNA */
PSGCTL psgctl[3]; /*!< PSG */
OPL3CTL opl3ctl[1]; /*!< OPL3 */
OPL3CTL opl3ctl[8]; /*!< OPL3 */
KDDELAYE delaye[KEYDISP_DELAYEVENTS];
} KEYDISP;

View File

@ -27,7 +27,7 @@ enum
enum
{
KEYDISP_CHMAX = 48,
KEYDISP_CHMAX = 64,
};
enum

View File

@ -303,6 +303,26 @@ static void info_sound(OEMCHAR *str, int maxlen, const NP2INFOEX *ex)
case SOUNDID_SB16:
lpBoard = OEMTEXT("Sound Blaster 16");
break;
case SOUNDID_PC_9801_86_SB16:
lpBoard = OEMTEXT("PC-9801-86 + Sound Blaster 16");
break;
case SOUNDID_WSS_SB16:
lpBoard = OEMTEXT("Mate-X PCM + Sound Blaster 16");
break;
case SOUNDID_PC_9801_86_WSS_SB16:
lpBoard = OEMTEXT("PC-9801-86 + Mate-X PCM + Sound Blaster 16");
break;
case SOUNDID_PC_9801_118_SB16:
lpBoard = OEMTEXT("PC-9801-118 + Sound Blaster 16");
break;
case SOUNDID_PC_9801_86_118_SB16:
lpBoard = OEMTEXT("PC-9801-86 + PC-9801-118 + Sound Blaster 16");
break;
#endif // defined(SUPPORT_SOUND_SB16)
#if defined(SUPPORT_PX)

View File

@ -1072,6 +1072,16 @@ void MEMCALL memp_write8(UINT32 address, REG8 value) {
//if(TEST_START_ADDR < address && address <= TEST_END_ADDR){
// printf("%d: %d\n", address, value);
//}
#if defined(SUPPORT_VGA_MODEX)
// PC/AT互換機 標準VGA相当 書き込み限定で許可
if(np2clvga.modex && vramWndAddr3==0xa0000){
UINT32 addr3 = address;
if(vramWndAddr3 <= addr3 && addr3 < vramWndAddr3 + VRA3WINDOW_SIZEX){
cirrus_vga_mem_writeb(cirrusvga_opaque, addr3, value);
vramWndAddr3 = 0;
}
}
#endif
if(np2clvga.gd54xxtype!=CIRRUS_98ID_PCI){
if(vramWndAddr){
if(vramWndAddr <= address){
@ -1110,16 +1120,6 @@ void MEMCALL memp_write8(UINT32 address, REG8 value) {
// return;
}
}
}else{
#if defined(SUPPORT_VGA_MODEX)
// PC/AT互換機 標準VGA相当 書き込み限定で許可
if(np2clvga.modex && vramWndAddr3==0xa0000){
UINT32 addr3 = address;
if(vramWndAddr3 <= addr3 && addr3 < vramWndAddr3 + VRA3WINDOW_SIZEX){
cirrus_vga_mem_writeb(cirrusvga_opaque, addr3, value);
}
}
#endif
}
}
#endif
@ -1205,6 +1205,16 @@ void MEMCALL memp_write16(UINT32 address, REG16 value) {
//if(TEST_START_ADDR < address && address <= TEST_END_ADDR){
// printf("%d: %d\n", address, value);
//}
#if defined(SUPPORT_VGA_MODEX)
// PC/AT互換機 標準VGA相当 書き込み限定で許可
if(np2clvga.modex && vramWndAddr3==0xa0000){
UINT32 addr3 = address;
if(vramWndAddr3 <= addr3 && addr3 < vramWndAddr3 + VRA3WINDOW_SIZEX){
cirrus_vga_mem_writew(cirrusvga_opaque, addr3, value);
vramWndAddr3 = 0;
}
}
#endif
if(np2clvga.gd54xxtype!=CIRRUS_98ID_PCI){
if(vramWndAddr){
if(vramWndAddr <= address){
@ -1243,16 +1253,6 @@ void MEMCALL memp_write16(UINT32 address, REG16 value) {
// return;
}
}
}else{
#if defined(SUPPORT_VGA_MODEX)
// PC/AT互換機 標準VGA相当 書き込み限定で許可
if(np2clvga.modex && vramWndAddr3==0xa0000){
UINT32 addr3 = address;
if(vramWndAddr3 <= addr3 && addr3 < vramWndAddr3 + VRA3WINDOW_SIZEX){
cirrus_vga_mem_writew(cirrusvga_opaque, addr3, value);
}
}
#endif
}
}
#endif
@ -1361,6 +1361,16 @@ void MEMCALL memp_write32(UINT32 address, UINT32 value) {
//if(TEST_START_ADDR < address && address <= TEST_END_ADDR){
// printf("%d: %d\n", address, value);
//}
#if defined(SUPPORT_VGA_MODEX)
// PC/AT互換機 標準VGA相当 書き込み限定で許可
if(np2clvga.modex && vramWndAddr3==0xa0000){
UINT32 addr3 = address;
if(vramWndAddr3 <= addr3 && addr3 < vramWndAddr3 + VRA3WINDOW_SIZEX){
cirrus_vga_mem_writel(cirrusvga_opaque, addr3, value);
vramWndAddr3 = 0;
}
}
#endif
if(np2clvga.gd54xxtype!=CIRRUS_98ID_PCI){
if(vramWndAddr){
if(vramWndAddr <= address){
@ -1399,16 +1409,6 @@ void MEMCALL memp_write32(UINT32 address, UINT32 value) {
// return;
}
}
}else{
#if defined(SUPPORT_VGA_MODEX)
// PC/AT互換機 標準VGA相当 書き込み限定で許可
if(np2clvga.modex && vramWndAddr3==0xa0000){
UINT32 addr3 = address;
if(vramWndAddr3 <= addr3 && addr3 < vramWndAddr3 + VRA3WINDOW_SIZEX){
cirrus_vga_mem_writel(cirrusvga_opaque, addr3, value);
}
}
#endif
}
}
#endif

View File

@ -553,7 +553,8 @@ cpucontinue:
if(remclock_mul < 100000) {
latecount++;
if(latecount > +LATECOUNTER_THRESHOLD){
if(pccore.multiple > 2){
if(pccore.multiple > 4){
UINT32 oldmultiple = pccore.multiple;
if(pccore.multiple > 40){
pccore.multiple-=3;
}else if(pccore.multiple > 20){
@ -562,6 +563,7 @@ cpucontinue:
pccore.multiple-=1;
}
pccore.realclock = pccore.baseclock * pccore.multiple;
nevent_changeclock(oldmultiple, pccore.multiple);
sound_changeclock();
beep_changeclock();
@ -578,9 +580,10 @@ cpucontinue:
}
}
asynccpu_lateflag = 1;
CPU_REMCLOCK = 0;
break;
}
CPU_REMCLOCK = 0;
break;
}else{
if(!hltflag && !asynccpu_lateflag && g_nevent.item[NEVENT_FLAMES].proc==screendisp && g_nevent.item[NEVENT_FLAMES].clock <= CPU_BASECLOCK){
//CPU_REMCLOCK = 10000;
@ -589,8 +592,10 @@ cpucontinue:
latecount--;
if(latecount < -LATECOUNTER_THRESHOLDM){
if(pccore.multiple < pccore.maxmultiple){
UINT32 oldmultiple = pccore.multiple;
pccore.multiple+=1;
pccore.realclock = pccore.baseclock * pccore.multiple;
nevent_changeclock(oldmultiple, pccore.multiple);
sound_changeclock();
beep_changeclock();
@ -601,9 +606,8 @@ cpucontinue:
keyboard_changeclock();
mouseif_changeclock();
gdc_updateclock();
latecount = 0;
}
latecount = 0;
}
asynccpu_fastflag = 1;
}

View File

@ -400,6 +400,7 @@ typedef struct {
char cpu_brandstring[64]; // ブランド名48byte
UINT32 cpu_brandid; // ブランドID
UINT32 cpu_feature_ecx; // ECX機能フラグ
UINT32 cpu_eflags_mask; // EFLAGSマスク(1のところがマスク状態)
UINT32 reserved[32]; // 将来の拡張のためにとりあえず32bit*32個用意しておく
UINT8 fpu_type; // FPU種類
@ -506,6 +507,10 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_I486SX_MODEL 2 /* 486SX */
#define CPU_I486SX_STEPPING 3
#define CPU_80386_FAMILY 3
#define CPU_80386_MODEL 0 /* 80386 */
#define CPU_80386_STEPPING 8
#define CPU_80286_FAMILY 2
#define CPU_80286_MODEL 1 /* 80286 */
#define CPU_80286_STEPPING 1
@ -612,6 +617,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_FEATURES_PENTIUM (CPU_FEATURE_FPU|CPU_FEATURE_CX8|CPU_FEATURE_TSC|CPU_FEATURE_VME_FLAG)
#define CPU_FEATURES_I486DX (CPU_FEATURE_FPU)
#define CPU_FEATURES_I486SX (0)
#define CPU_FEATURES_80386 (0)
#define CPU_FEATURES_80286 (0)
#define CPU_FEATURES_AMD_K7_ATHLON_XP (CPU_FEATURE_FPU|CPU_FEATURE_TSC|CPU_FEATURE_VME_FLAG|CPU_FEATURE_CMOV|CPU_FEATURE_FXSR|CPU_FEATURE_MMX|CPU_FEATURE_CLFSH|CPU_FEATURE_SSE)
@ -650,6 +656,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_FEATURES_EX_PENTIUM (0)
#define CPU_FEATURES_EX_I486DX (0)
#define CPU_FEATURES_EX_I486SX (0)
#define CPU_FEATURES_EX_80386 (0)
#define CPU_FEATURES_EX_80286 (0)
#define CPU_FEATURES_EX_AMD_K6_2 (CPU_FEATURE_EX_3DNOW)
@ -709,6 +716,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_FEATURES_ECX_PENTIUM (0)
#define CPU_FEATURES_ECX_I486DX (0)
#define CPU_FEATURES_ECX_I486SX (0)
#define CPU_FEATURES_ECX_80386 (0)
#define CPU_FEATURES_ECX_80286 (0)
#define CPU_FEATURES_ECX_AMD_K6_2 (0)
@ -717,6 +725,25 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_FEATURES_ECX_AMD_K7_ATHLON_XP (0)
/* EFLAGS MASK */
#define CPU_EFLAGS_MASK_PENTIUM_4 (0)
#define CPU_EFLAGS_MASK_PENTIUM_M (0)
#define CPU_EFLAGS_MASK_PENTIUM_III (0)
#define CPU_EFLAGS_MASK_PENTIUM_II (0)
#define CPU_EFLAGS_MASK_PENTIUM_PRO (0)
#define CPU_EFLAGS_MASK_MMX_PENTIUM (0)
#define CPU_EFLAGS_MASK_PENTIUM (0)
#define CPU_EFLAGS_MASK_I486DX (0)
#define CPU_EFLAGS_MASK_I486SX (0)
#define CPU_EFLAGS_MASK_80386 ((1 << 18))
#define CPU_EFLAGS_MASK_80286 ((1 << 18))
#define CPU_EFLAGS_MASK_AMD_K6_2 (0)
#define CPU_EFLAGS_MASK_AMD_K6_III (0)
#define CPU_EFLAGS_MASK_AMD_K7_ATHLON (0)
#define CPU_EFLAGS_MASK_AMD_K7_ATHLON_XP (0)
/* brand string */
#define CPU_BRAND_STRING_PENTIUM_4 "Intel(R) Pentium(R) 4 CPU "
#define CPU_BRAND_STRING_PENTIUM_M "Intel(R) Pentium(R) M processor "
@ -727,6 +754,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_BRAND_STRING_PENTIUM "Intel(R) Pentium(R) Processor "
#define CPU_BRAND_STRING_I486DX "Intel(R) i486DX Processor "
#define CPU_BRAND_STRING_I486SX "Intel(R) i486SX Processor "
#define CPU_BRAND_STRING_80386 "Intel(R) 80386 Processor "
#define CPU_BRAND_STRING_80286 "Intel(R) 80286 Processor "
#define CPU_BRAND_STRING_AMD_K6_2 "AMD-K6(tm) 3D processor "
#define CPU_BRAND_STRING_AMD_K6_III "AMD-K6(tm) 3D+ Processor "
@ -746,6 +774,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_BRAND_ID_PENTIUM 0
#define CPU_BRAND_ID_I486DX 0
#define CPU_BRAND_ID_I486SX 0
#define CPU_BRAND_ID_80386 0
#define CPU_BRAND_ID_80286 0
#define CPU_BRAND_ID_AMD_K6_2 0
#define CPU_BRAND_ID_AMD_K6_III 0
@ -767,6 +796,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_FEATURES_ECX CPU_FEATURES_ECX_PENTIUM_III
#define CPU_BRAND_STRING CPU_BRAND_STRING_PENTIUM_III
#define CPU_BRAND_ID CPU_BRAND_ID_PENTIUM_III
#define CPU_EFLAGS_MASK CPU_EFLAGS_MASK_PENTIUM_III
//#define CPU_FAMILY CPU_PENTIUM_4_FAMILY
//#define CPU_MODEL CPU_PENTIUM_4_MODEL /* Pentium 4 */
//#define CPU_STEPPING CPU_PENTIUM_4_STEPPING
@ -775,6 +805,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
//#define CPU_FEATURES_ECX CPU_FEATURES_ECX_PENTIUM_4
//#define CPU_BRAND_STRING CPU_BRAND_STRING_PENTIUM_4
//#define CPU_BRAND_ID CPU_BRAND_ID_PENTIUM_4
//#define CPU_EFLAGS_MASK CPU_EFLAGS_MASK_PENTIUM_4
#elif defined(USE_SSE2)
#define CPU_FAMILY CPU_PENTIUM_III_FAMILY
#define CPU_MODEL CPU_PENTIUM_III_MODEL /* Pentium III */
@ -784,6 +815,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_FEATURES_ECX CPU_FEATURES_ECX_PENTIUM_III
#define CPU_BRAND_STRING CPU_BRAND_STRING_PENTIUM_III
#define CPU_BRAND_ID CPU_BRAND_ID_PENTIUM_III
#define CPU_EFLAGS_MASK CPU_EFLAGS_MASK_PENTIUM_III
//#define CPU_FAMILY CPU_PENTIUM_M_FAMILY
//#define CPU_MODEL CPU_PENTIUM_M_MODEL /* Pentium M */
//#define CPU_STEPPING CPU_PENTIUM_M_STEPPING
@ -792,6 +824,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
//#define CPU_FEATURES_ECX CPU_FEATURES_ECX_PENTIUM_M
//#define CPU_BRAND_STRING CPU_BRAND_STRING_PENTIUM_M
//#define CPU_BRAND_ID CPU_BRAND_ID_PENTIUM_M
//#define CPU_EFLAGS_MASK CPU_EFLAGS_MASK_PENTIUM_M
#elif defined(USE_SSE)
#define CPU_FAMILY CPU_PENTIUM_III_FAMILY
#define CPU_MODEL CPU_PENTIUM_III_MODEL /* Pentium III */
@ -801,6 +834,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_FEATURES_ECX CPU_FEATURES_ECX_PENTIUM_III
#define CPU_BRAND_STRING CPU_BRAND_STRING_PENTIUM_III
#define CPU_BRAND_ID CPU_BRAND_ID_PENTIUM_III
#define CPU_EFLAGS_MASK CPU_EFLAGS_MASK_PENTIUM_III
#elif defined(USE_MMX)
#define CPU_FAMILY CPU_PENTIUM_II_FAMILY
#define CPU_MODEL CPU_PENTIUM_II_MODEL /* Pentium II */
@ -810,6 +844,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_FEATURES_ECX CPU_FEATURES_ECX_PENTIUM_II
#define CPU_BRAND_STRING CPU_BRAND_STRING_PENTIUM_II
#define CPU_BRAND_ID CPU_BRAND_ID_PENTIUM_II
#define CPU_EFLAGS_MASK CPU_EFLAGS_MASK_PENTIUM_II
#else
#define CPU_FAMILY CPU_PENTIUM_FAMILY
#define CPU_MODEL CPU_PENTIUM_MODEL /* Pentium */
@ -819,6 +854,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_FEATURES_ECX CPU_FEATURES_ECX_PENTIUM
#define CPU_BRAND_STRING CPU_BRAND_STRING_PENTIUM
#define CPU_BRAND_ID CPU_BRAND_ID_PENTIUM
#define CPU_EFLAGS_MASK CPU_EFLAGS_MASK_PENTIUM
#endif
#else
#define CPU_FAMILY CPU_I486SX_FAMILY
@ -829,6 +865,7 @@ extern sigjmp_buf exec_1step_jmpbuf;
#define CPU_FEATURES_ECX CPU_FEATURES_ECX_I486SX
#define CPU_BRAND_STRING CPU_BRAND_STRING_I486SX
#define CPU_BRAND_ID CPU_BRAND_ID_I486SX
#define CPU_EFLAGS_MASK CPU_EFLAGS_MASK_I486SX
#endif

View File

@ -33,7 +33,7 @@
#endif
I386CORE i386core;
I386CPUID i386cpuid = {I386CPUID_VERSION, CPU_VENDOR, CPU_FAMILY, CPU_MODEL, CPU_STEPPING, CPU_FEATURES, CPU_FEATURES_EX, CPU_BRAND_STRING, CPU_BRAND_ID, CPU_FEATURES_ECX};
I386CPUID i386cpuid = {I386CPUID_VERSION, CPU_VENDOR, CPU_FAMILY, CPU_MODEL, CPU_STEPPING, CPU_FEATURES, CPU_FEATURES_EX, CPU_BRAND_STRING, CPU_BRAND_ID, CPU_FEATURES_ECX, CPU_EFLAGS_MASK};
I386MSR i386msr = {0};
UINT8 *reg8_b20[0x100];
@ -288,6 +288,7 @@ set_eflags(UINT32 new_flags, UINT32 mask)
mask &= I_FLAG|IOPL_FLAG|RF_FLAG|VM_FLAG|VIF_FLAG|VIP_FLAG;
mask |= SZAPC_FLAG|T_FLAG|D_FLAG|O_FLAG|NT_FLAG;
mask |= AC_FLAG|ID_FLAG;
mask &= ~i386cpuid.cpu_eflags_mask;
modify_eflags(new_flags, mask);
}

View File

@ -122,10 +122,17 @@ _CPUID(void)
break;
case 2:
CPU_EAX = 0;
CPU_EBX = 0;
CPU_ECX = 0;
CPU_EDX = 0;
if(i386cpuid.cpu_family >= 6){
CPU_EAX = 0x1;
CPU_EBX = 0;
CPU_ECX = 0;
CPU_EDX = 0x43; // 512KB L2 Cache のふり
}else{
CPU_EAX = 0;
CPU_EBX = 0;
CPU_ECX = 0;
CPU_EDX = 0;
}
break;
case 0x80000000:

280
i386c/ia32/instructions/sse2/sse2.c Executable file → Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1140,15 +1140,16 @@ RDTSC(void)
// ia32_panic("RDTSC: not implemented yet!");
UINT64 tsc_tmp;
if(CPU_REMCLOCK != -1){
tsc_tmp = CPU_MSR_TSC - CPU_REMCLOCK;
tsc_tmp = CPU_MSR_TSC - CPU_REMCLOCK * pccore.maxmultiple / pccore.multiple;
}else{
tsc_tmp = CPU_MSR_TSC;
}
//tsc_tmp /= 1000;
tsc_tmp = (tsc_tmp >> 10); // XXX: ????
tsc_tmp = (tsc_tmp >> 8); // XXX: ????
CPU_EDX = ((tsc_tmp >> 32) & 0xffffffff);
CPU_EAX = (tsc_tmp & 0xffffffff);
#else
#if defined(SUPPORT_IA32_HAXM)
LARGE_INTEGER li = {0};
LARGE_INTEGER qpf;
QueryPerformanceCounter(&li);
@ -1158,6 +1159,7 @@ RDTSC(void)
CPU_EDX = li.HighPart;
CPU_EAX = li.LowPart;
#endif
#endif
#else
UINT64 tsc_tmp;
if(CPU_REMCLOCK != -1){

View File

@ -970,6 +970,7 @@ coutinue_cpu:
// リセット可能フラグをクリア
np2haxcore.ready_for_reset = 0;
coutinue_cpu_imm:
// HAXM CPU実行
if(np2hax.emumode){
tunnel->_exit_status = HAX_EXIT_STATECHANGE;
@ -1047,6 +1048,10 @@ coutinue_cpu:
}
break;
}
if(tunnel->io._port==0x1480){
// ゲームポート読み取りは即座に返す
goto coutinue_cpu_imm;
}
if(CPU_REMCLOCK==-1){
break;
}

View File

@ -9,6 +9,9 @@
#include "iocore.h"
#include "sound.h"
#include "cs4231.h"
#if defined(SUPPORT_SOUND_SB16)
#include "ct1741io.h"
#endif
#include "sasiio.h"
void DMACCALL dma_dummyout(REG8 data) {
@ -39,9 +42,14 @@ static const DMAPROC dmaproc[] = {
#endif
{dma_dummyout, dma_dummyin, dma_dummyproc}, // SCSI
#if !defined(DISABLE_SOUND)
{dma_dummyout, dma_dummyin, cs4231dmafunc}, // CS4231
#if defined(SUPPORT_SOUND_SB16)
{dma_dummyout, dma_dummyin, ct1741dmafunc}, // CT1741
#else
{dma_dummyout, dma_dummyin, dma_dummyproc}, // SASI
{dma_dummyout, dma_dummyin, dma_dummyproc}, // Dummy
#endif
#else
{dma_dummyout, dma_dummyin, dma_dummyproc}, // Dummy
{dma_dummyout, dma_dummyin, dma_dummyproc}, // Dummy
#endif
};
@ -280,8 +288,9 @@ static REG8 IOINPCALL dmac_i03(UINT port) {
static REG8 IOINPCALL dmac_i11(UINT port) {
(void)port;
return(dmac.stat &= 0xf0); // ToDo!!
REG8 ret = dmac.stat;
dmac.stat &= 0xf0;
return(ret); // ToDo!!
}
static void IOOUTCALL dmac_oe05(UINT port, REG8 dat) {
@ -381,6 +390,9 @@ static void dmacset(REG8 channel) {
case 3:TRACEOUT(("dmac set %d - SASI", channel));break;
case 4:TRACEOUT(("dmac set %d - SCSI", channel));break;
case 5:TRACEOUT(("dmac set %d - cs4231p", channel));break;
#if defined(SUPPORT_SOUND_SB16)
case 6:TRACEOUT(("dmac set %d - CT1741", channel));break;
#endif
}
dmac.dmach[channel].proc = dmaproc[dmadev];
}

View File

@ -252,7 +252,7 @@ static void np2sysp_cngconfig(const void *arg1, long arg2) {
if(configvalue != (UINT8)g_nSoundID){
sound_reset();
fmboard_unbind();
if(g_nSoundID == SOUNDID_PC_9801_118){
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16){
iocore_detachout(cs4231.port[10]);
iocore_detachinp(cs4231.port[10]);
iocore_detachout(cs4231.port[10]+1);
@ -263,10 +263,10 @@ static void np2sysp_cngconfig(const void *arg1, long arg2) {
fmboard_bind();
if (((pccore.model & PCMODELMASK) >= PCMODEL_VX) &&
(pccore.sound & 0x7e)) {
if(g_nSoundID == SOUNDID_MATE_X_PCM || ((g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118) && np2cfg.snd118irqf == np2cfg.snd118irqp) || g_nSoundID == SOUNDID_PC_9801_86_WSS || g_nSoundID == SOUNDID_WAVESTAR){
if(g_nSoundID == SOUNDID_MATE_X_PCM || ((g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16) && np2cfg.snd118irqf == np2cfg.snd118irqp) || g_nSoundID == SOUNDID_PC_9801_86_WSS || g_nSoundID == SOUNDID_WAVESTAR || g_nSoundID==SOUNDID_PC_9801_86_WSS_SB16){
iocore_out8(0x188, 0x27);
iocore_out8(0x18a, 0x30);
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_WAVESTAR){
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID==SOUNDID_WAVESTAR || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
iocore_out8(cs4231.port[4], 0x27);
iocore_out8(cs4231.port[4]+2, 0x30);
}
@ -275,7 +275,7 @@ static void np2sysp_cngconfig(const void *arg1, long arg2) {
iocore_out8(0x18a, 0x3f);
}
}
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118){
if(g_nSoundID == SOUNDID_PC_9801_118 || g_nSoundID == SOUNDID_PC_9801_86_118 || g_nSoundID == SOUNDID_PC_9801_118_SB16 || g_nSoundID == SOUNDID_PC_9801_86_118_SB16){
iocore_attachout(cs4231.port[10], mpu98ii_o0);
iocore_attachinp(cs4231.port[10], mpu98ii_i0);
iocore_attachout(cs4231.port[10]+1, mpu98ii_o2);

View File

@ -161,6 +161,32 @@ static UINT8 rs232c_buf_rpos = 0;
static UINT8 rs232c_buf_wpos = 0;
static int rs232c_removecounter = 0;
static void rs232c_writeretry() {
int ret;
if((rs232c.result & 0x1) != 0) return;
if (cm_rs232c) {
#if !defined(NP2_X11) && !defined(NP2_SDL2) && !defined(__LIBRETRO__)
cm_rs232c->writeretry(cm_rs232c);
ret = cm_rs232c->lastwritesuccess(cm_rs232c);
if(ret==0){
return; // 書き込み無視
}
#endif
rs232c.result |= 0x5;
}
if (sysport.c & 4) {
rs232c.send = 0;
#if defined(SUPPORT_RS232C_FIFO)
rs232cfifo.irqflag = 1;
#endif
pic_setirq(4);
}
else {
rs232c.send = 1;
}
}
void rs232c_construct(void) {
cm_rs232c = NULL;
@ -190,6 +216,9 @@ void rs232c_callback(void) {
if(bufused == 0){
rs232c_removecounter = 0;
}
rs232c_writeretry();
#if defined(SUPPORT_RS232C_FIFO)
if(rs232cfifo.port138 & 0x1){
rs232c_removecounter = 0; // FIFOモードでは消さない
@ -273,8 +302,19 @@ void rs232c_midipanic(void) {
static void IOOUTCALL rs232c_o30(UINT port, REG8 dat) {
int ret;
if (cm_rs232c) {
rs232c_writeretry();
cm_rs232c->write(cm_rs232c, (UINT8)dat);
#if !defined(NP2_X11) && !defined(NP2_SDL2) && !defined(__LIBRETRO__)
ret = cm_rs232c->lastwritesuccess(cm_rs232c);
if(!ret){
rs232c.result &= ~0x5;
return; // まだ書き込めないので待つ
}
#endif
rs232c.result |= 0x5;
}
if (sysport.c & 4) {
rs232c.send = 0;
@ -362,6 +402,8 @@ static REG8 IOINPCALL rs232c_i30(UINT port) {
UINT8 ret = rs232c.data;
rs232c_writeretry();
#if defined(SUPPORT_RS232C_FIFO)
if(port==0x130){
if (rs232c_buf_rpos == rs232c_buf_wpos) {
@ -404,8 +446,11 @@ static REG8 IOINPCALL rs232c_i30(UINT port) {
static REG8 IOINPCALL rs232c_i32(UINT port) {
UINT8 ret = rs232c.result;
UINT8 ret;
rs232c_writeretry();
ret = rs232c.result;
if (!(rs232c_stat() & 0x20)) {
return(ret | 0x80);
}
@ -417,8 +462,11 @@ static REG8 IOINPCALL rs232c_i32(UINT port) {
static REG8 IOINPCALL rs232c_i132(UINT port) {
UINT8 ret = rs232c.result;
UINT8 ret;
rs232c_writeretry();
ret = rs232c.result;
ret = (ret & ~0xf7) | ((rs232c.result << 1) & 0x6) | ((rs232c.result >> 2) & 0x1);
if (!(rs232c_stat() & 0x20)) {

View File

@ -117,6 +117,21 @@ void nevent_progress(void)
// TRACEOUT(("nextbase = %d (%d)", nextbase, CPU_REMCLOCK));
}
void nevent_changeclock(UINT32 oldclock, UINT32 newclock)
{
UINT i;
NEVENTID id;
NEVENTITEM item;
for (i = 0; i < g_nevent.readyevents; i++)
{
id = g_nevent.level[i];
item = &g_nevent.item[id];
if(item->clock > 0){
item->clock = item->clock * newclock / oldclock;
}
}
}
void nevent_reset(NEVENTID id)
{

View File

@ -135,6 +135,8 @@ SINT32 nevent_getremain(NEVENTID id);
// NEVENTの強制脱出
void nevent_forceexit(void);
void nevent_changeclock(UINT32 oldclock, UINT32 newclock);
#ifdef __cplusplus
}
#endif

View File

@ -35,6 +35,9 @@
#include "makegrex.h"
#include "sound.h"
#include "fmboard.h"
#ifdef SUPPORT_SOUND_SB16
#include "ct1741io.h"
#endif
#include "beep.h"
#include "s98.h"
#include "tms3631.h"
@ -81,6 +84,7 @@
#define CPU_BRAND_STRING "Intel(R) 80286 Processor "
#define CPU_FEATURES_ECX (0)
#define CPU_BRAND_ID_AUTO (0xffffffff)
#define CPU_EFLAGS_MASK (0)
#endif
#if defined(SUPPORT_IA32_HAXM)
#include "np2_tickcount.h"
@ -128,7 +132,7 @@ const OEMCHAR np2version[] = OEMTEXT(NP2VER_CORE);
0x70, 1, 3, // Mate-X PCM
#if defined(SUPPORT_SOUND_SB16)
0xd2, 3, 5,
0xd2, 3, 5, 0,
#endif /* SUPPORT_SOUND_SB16 */
#if defined(SUPPORT_FMGEN)
@ -191,13 +195,16 @@ const OEMCHAR np2version[] = OEMTEXT(NP2VER_CORE);
0, 0xff00,
0, 0, 0,
1,
CPU_VENDOR, CPU_FAMILY, CPU_MODEL, CPU_STEPPING, CPU_FEATURES, CPU_FEATURES_EX, CPU_BRAND_STRING, OEMTEXT(""), OEMTEXT(""), CPU_BRAND_ID_AUTO, CPU_FEATURES_ECX,
CPU_VENDOR, CPU_FAMILY, CPU_MODEL, CPU_STEPPING, CPU_FEATURES, CPU_FEATURES_EX, CPU_BRAND_STRING, OEMTEXT(""), OEMTEXT(""), CPU_BRAND_ID_AUTO, CPU_FEATURES_ECX, CPU_EFLAGS_MASK,
FPU_TYPE_SOFTFLOAT,
#if defined(SUPPORT_FAST_MEMORYCHECK)
1,
#endif
0, 0,
1, 0,
#if defined(SUPPORT_GAMEPORT)
0,
#endif
};
PCCORE pccore = { PCBASECLOCK25, PCBASEMULTIPLE,
@ -381,6 +388,9 @@ static void sound_init(void)
pcm86gen_initialize(rate);
pcm86gen_setvol(np2cfg.vol_pcm);
cs4231_initialize(rate);
#ifdef SUPPORT_SOUND_SB16
ct1741_initialize(rate);
#endif
amd98_initialize(rate);
oplgen_initialize(rate);
oplgen_setvol(np2cfg.vol_fm);
@ -640,7 +650,10 @@ void pccore_reset(void) {
}
#if defined(CPUCORE_IA32)
if(np2cfg.cpu_family == CPU_I486SX_FAMILY && np2cfg.cpu_model == CPU_I486SX_MODEL){
if(np2cfg.cpu_family == CPU_80386_FAMILY && np2cfg.cpu_model == CPU_80386_MODEL){
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_80386);
}else if(np2cfg.cpu_family == CPU_I486SX_FAMILY && np2cfg.cpu_model == CPU_I486SX_MODEL){
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_I486SX);
}else if(np2cfg.cpu_family == CPU_I486DX_FAMILY && np2cfg.cpu_model == CPU_I486DX_MODEL){
@ -724,6 +737,7 @@ void pccore_reset(void) {
i386cpuid.cpu_feature = CPU_FEATURES_ALL;
i386cpuid.cpu_feature_ex = CPU_FEATURES_EX_ALL;
i386cpuid.cpu_feature_ecx = CPU_FEATURES_ALL;
i386cpuid.cpu_eflags_mask = 0;
i386cpuid.cpu_brandid = 0;
}else{
i386cpuid.cpu_family = np2cfg.cpu_family;
@ -732,6 +746,7 @@ void pccore_reset(void) {
i386cpuid.cpu_feature = CPU_FEATURES_ALL & np2cfg.cpu_feature;
i386cpuid.cpu_feature_ex = CPU_FEATURES_EX_ALL & np2cfg.cpu_feature_ex;
i386cpuid.cpu_feature_ecx = CPU_FEATURES_ECX_ALL & np2cfg.cpu_feature_ecx;
i386cpuid.cpu_eflags_mask = (AC_FLAG) & np2cfg.cpu_eflags_mask;
i386cpuid.cpu_brandid = np2cfg.cpu_brandid;
}
strcpy(i386cpuid.cpu_brandstring, np2cfg.cpu_brandstring);
@ -1085,6 +1100,7 @@ void pccore_postevent(UINT32 event) { // yet!
void pccore_exec(BOOL draw) {
static UINT32 disptmr = 0;
static UINT32 baseclk = 0;
pcstat.drawframe = (UINT8)draw;
// keystat_sync();
@ -1112,6 +1128,10 @@ void pccore_exec(BOOL draw) {
while(pcstat.screendispflag) {
#if defined(TRACE)
resetcnt++;
#endif
#if defined(USE_TSC)
CPU_MSR_TSC += CPU_BASECLOCK * pccore.maxmultiple / pccore.multiple;
baseclk = CPU_BASECLOCK * pccore.maxmultiple / pccore.multiple;
#endif
pic_irq();
#if defined(SUPPORT_IA32_HAXM)
@ -1153,11 +1173,6 @@ void pccore_exec(BOOL draw) {
#endif
CPU_SHUT();
}
#if defined(USE_TSC)
#if defined(NP2_X11) || defined(NP2_SDL2) || defined(__LIBRETRO__)
CPU_MSR_TSC += CPU_BASECLOCK;//CPU_REMCLOCK;
#endif
#endif
#if defined(SUPPORT_IA32_HAXM)
if (np2hax.enable) {
i386hax_vm_exec();
@ -1179,6 +1194,9 @@ void pccore_exec(BOOL draw) {
}
#endif
}
#if defined(USE_TSC)
CPU_MSR_TSC = CPU_MSR_TSC - baseclk + CPU_BASECLOCK * pccore.maxmultiple / pccore.multiple;
#endif
#if defined(SUPPORT_HRTIMER)
upd4990_hrtimer_count();
#endif /* SUPPORT_HRTIMER */

View File

@ -53,6 +53,11 @@ enum tagSoundId
SOUNDID_86_SPEAKBOARD = 0x24, /*!< PC-9801-86 + Speak board */
SOUNDID_SPARKBOARD = 0x40, /*!< Spark board */
SOUNDID_SB16 = 0x41, /*!< Sound Blaster 16 */
SOUNDID_PC_9801_86_WSS_SB16 = 0x42, /*!< PC-9801-86 + Mate-X PCM(B460) + Sound Blaster 16 */
SOUNDID_WSS_SB16 = 0x43, /*!< Mate-X PCM(B460) + Sound Blaster 16 */
SOUNDID_PC_9801_86_SB16 = 0x44, /*!< PC-9801-86 + Sound Blaster 16 */
SOUNDID_PC_9801_118_SB16 = 0x45, /*!< PC-9801-118 + Sound Blaster 16 */
SOUNDID_PC_9801_86_118_SB16 = 0x46, /*!< PC-9801-86 + PC-9801-118(B460) + Sound Blaster 16 */
SOUNDID_MATE_X_PCM = 0x60, /*!< Mate-X PCM */
SOUNDID_PC_9801_86_WSS = 0x64, /*!< PC-9801-86 + Mate-X PCM(B460) */
SOUNDID_PC_9801_86_118 = 0x68, /*!< PC-9801-86 + PC-9801-118(B460) */
@ -161,6 +166,7 @@ struct tagNP2Config
UINT8 sndsb16io;
UINT8 sndsb16dma;
UINT8 sndsb16irq;
UINT8 sndsb16at;
#endif /* SUPPORT_SOUND_SB16 */
UINT8 BEEP_VOL;
@ -285,6 +291,7 @@ struct tagNP2Config
OEMCHAR cpu_brandstring_o[64]; // ブランド名48byteOEMCHAR
UINT32 cpu_brandid; // ブランドID
UINT32 cpu_feature_ecx; // ECX機能フラグ
UINT32 cpu_eflags_mask; // EFLAGSマスク
UINT8 fpu_type; // FPU種類0=Berkeley SoftFloat, 1=DOSBox FPU, 2=DOSBox FPU+INT64
@ -297,6 +304,10 @@ struct tagNP2Config
UINT8 usecdecc; // CD-ROM EDC/ECC エミュレーションサポート
UINT8 cddtskip; // CD-ROM オーディオ再生時にデータトラックをスキップ
#if defined(SUPPORT_GAMEPORT)
UINT8 gameport; // 118音源のゲームポートを使用する
#endif
};
typedef struct tagNP2Config NP2CFG; /*!< The define of config */

View File

@ -43,6 +43,8 @@ struct _commng {
UINT connect;
UINT (*read)(COMMNG self, UINT8 *data);
UINT (*write)(COMMNG self, UINT8 data);
UINT (*writeretry)(COMMNG self);
UINT (*lastwritesuccess)(COMMNG self);
UINT8 (*getstat)(COMMNG self);
INTPTR (*msg)(COMMNG self, UINT msg, INTPTR param);
void (*release)(COMMNG self);

View File

@ -611,6 +611,7 @@ static const INITBL iniitem[] = {
{"optsb16p", INITYPE_HEX8, &np2cfg.sndsb16io, 0},
{"optsb16d", INITYPE_UINT8, &np2cfg.sndsb16dma, 0},
{"optsb16i", INITYPE_UINT8, &np2cfg.sndsb16irq, 0},
{"optsb16A", INITYPE_BOOL, &np2cfg.sndsb16at, 0},
#endif /* SUPPORT_SOUND_SB16 */
{"volume_F", INIMAX_UINT8, &np2cfg.vol_fm, 128},
@ -703,6 +704,9 @@ static const INITBL iniitem[] = {
{"cpu_feat", INITYPE_HEX32, &np2cfg.cpu_feature, 0},
{"cpu_f_ex", INITYPE_HEX32, &np2cfg.cpu_feature_ex, 0},
{"cpu_bran", INIRO_STR, np2cfg.cpu_brandstring_o, 63},
{"cpu_brid", INITYPE_HEX32, &np2cfg.cpu_brandid, 0},
{"cpu_fecx", INITYPE_HEX32, &np2cfg.cpu_feature_ecx, 0},
{"cpu_eflg", INITYPE_HEX32, &np2cfg.cpu_eflags_mask, 0},
{"FPU_TYPE", INITYPE_UINT8, &np2cfg.fpu_type, 0},
#if defined(SUPPORT_FAST_MEMORYCHECK)
@ -715,6 +719,9 @@ static const INITBL iniitem[] = {
#if defined(SUPPORT_IDEIO)
{"IDEBADDR", INIRO_HEX8, &np2cfg.idebaddr, 0},
#endif
#if defined(SUPPORT_GAMEPORT)
{"GAMEPORT", INITYPE_BOOL, &np2cfg.gameport, 0},
#endif
{"keyboard", INITYPE_KB, &np2oscfg.KEYBOARD, 0},
#if !defined(__LIBRETRO__)

View File

@ -947,6 +947,47 @@ static void update_variables(void)
np2cfg.baseclock = 2457600;
}
var.key = "np2kai_cpu_feature";
var.value = NULL;
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
UINT cpu_index;
if (strcmp(var.value, "Intel 80386") == 0)
cpu_index = 1;
else if (strcmp(var.value, "Intel i486SX") == 0)
cpu_index = 2;
else if (strcmp(var.value, "Intel i486DX") == 0)
cpu_index = 3;
else if (strcmp(var.value, "Intel Pentium") == 0)
cpu_index = 4;
else if (strcmp(var.value, "Intel MMX Pentium") == 0)
cpu_index = 5;
else if (strcmp(var.value, "Intel Pentium Pro") == 0)
cpu_index = 6;
else if (strcmp(var.value, "Intel Pentium II") == 0)
cpu_index = 7;
else if (strcmp(var.value, "Intel Pentium III") == 0)
cpu_index = 8;
else if (strcmp(var.value, "Intel Pentium M") == 0)
cpu_index = 9;
else if (strcmp(var.value, "Intel Pentium 4") == 0)
cpu_index = 10;
else if (strcmp(var.value, "AMD K6-2") == 0)
cpu_index = 15;
else if (strcmp(var.value, "AMD K6-III") == 0)
cpu_index = 16;
else if (strcmp(var.value, "AMD K7 Athlon") == 0)
cpu_index = 17;
else if (strcmp(var.value, "AMD K7 Athlon XP") == 0)
cpu_index = 18;
else if (strcmp(var.value, "Neko Processor II") == 0)
cpu_index = 255;
else
cpu_index = 0;
SetCpuTypeIndex(cpu_index);
}
var.key = "np2kai_clk_mult";
var.value = NULL;
@ -1039,15 +1080,15 @@ static void update_variables(void)
else if (strcmp(var.value, "PC9801-118") == 0)
np2cfg.SOUND_SW = 0x08;
else if (strcmp(var.value, "PC9801-86 + Mate-X PCM(B460)") == 0)
np2cfg.SOUND_SW = 0x64;
else if (strcmp(var.value, "PC9801-86 + 118") == 0)
np2cfg.SOUND_SW = 0x68;
else if (strcmp(var.value, "Mate-X PCM(B460)") == 0)
np2cfg.SOUND_SW = 0x60;
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_WSS;
else if (strcmp(var.value, "PC9801-86 + 118(B460)") == 0)
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_118;
else if (strcmp(var.value, "Mate-X PCM") == 0)
np2cfg.SOUND_SW = SOUNDID_MATE_X_PCM;
else if (strcmp(var.value, "Speak Board") == 0)
np2cfg.SOUND_SW = 0x20;
else if (strcmp(var.value, "PC9801-86 + Speak Board") == 0)
np2cfg.SOUND_SW = 0x24;
np2cfg.SOUND_SW = SOUNDID_86_SPEAKBOARD;
else if (strcmp(var.value, "Spark Board") == 0)
np2cfg.SOUND_SW = 0x40;
else if (strcmp(var.value, "Sound Orchestra") == 0)
@ -1055,7 +1096,17 @@ static void update_variables(void)
else if (strcmp(var.value, "Sound Orchestra-V") == 0)
np2cfg.SOUND_SW = 0x82;
else if (strcmp(var.value, "Sound Blaster 16") == 0)
np2cfg.SOUND_SW = 0x41;
np2cfg.SOUND_SW = SOUNDID_SB16;
else if (strcmp(var.value, "PC9801-86 + Sound Blaster 16") == 0)
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_SB16;
else if (strcmp(var.value, "Mate-X PCM + Sound Blaster 16") == 0)
np2cfg.SOUND_SW = SOUNDID_WSS_SB16;
else if (strcmp(var.value, "PC9801-118 + Sound Blaster 16") == 0)
np2cfg.SOUND_SW = SOUNDID_PC_9801_118_SB16;
else if (strcmp(var.value, "PC9801-86 + Mate-X PCM(B460) + Sound Blaster 16") == 0)
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_WSS_SB16;
else if (strcmp(var.value, "PC9801-86 + 118(B460) + Sound Blaster 16") == 0)
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_118_SB16;
else if (strcmp(var.value, "AMD-98") == 0)
np2cfg.SOUND_SW = 0x80;
else if (strcmp(var.value, "WaveStar") == 0)

View File

@ -73,6 +73,31 @@ struct retro_core_option_definition option_defs_us[] = {
},
"2.4576 MHz"
},
{
"np2kai_cpu_feature",
"CPU Feature (Restart)",
NULL,
{
{ "(custom)", NULL },
{ "Intel 80386", NULL },
{ "Intel i486SX", NULL },
{ "Intel i486DX", NULL },
{ "Intel Pentium", NULL },
{ "Intel MMX Pentium", NULL },
{ "Intel Pentium Pro", NULL },
{ "Intel Pentium II", NULL },
{ "Intel Pentium III", NULL },
{ "Intel Pentium M", NULL },
{ "Intel Pentium 4", NULL },
{ "AMD K6-2", NULL },
{ "AMD K6-III", NULL },
{ "AMD K7 Athlon", NULL },
{ "AMD K7 Athlon XP", NULL },
{ "Neko Processor II", NULL },
{ NULL, NULL},
},
"Intel 80386"
},
{
"np2kai_clk_mult",
"CPU Clock Multiplier (Restart)",
@ -211,20 +236,27 @@ struct retro_core_option_definition option_defs_us[] = {
{
{ "PC9801-14", NULL },
{ "PC9801-86", NULL },
{ "PC9801-86 + 118", NULL },
{ "PC9801-86 + 118(B460)", NULL },
{ "PC9801-86 + Mate-X PCM(B460)", NULL },
{ "PC9801-86 + Chibi-oto", NULL },
{ "PC9801-86 + Speak Board", NULL },
{ "PC9801-26K", NULL },
{ "PC9801-26K + 86", NULL },
{ "PC9801-118", NULL },
{ "Mate-X PCM(B460)", NULL },
{ "Mate-X PCM", NULL },
{ "Chibi-oto", NULL },
{ "Speak Board", NULL },
{ "Spark Board", NULL },
{ "Sound Orchestra", NULL },
{ "Sound Orchestra-V", NULL },
#if defined(SUPPORT_SOUND_SB16)
{ "Sound Blaster 16", NULL },
{ "PC9801-86 + Sound Blaster 16", NULL },
{ "Mate-X PCM + Sound Blaster 16", NULL },
{ "PC9801-118 + Sound Blaster 16", NULL },
{ "PC9801-86 + Mate-X PCM(B460) + Sound Blaster 16", NULL },
{ "PC9801-86 + 118(B460) + Sound Blaster 16", NULL },
#endif /* SUPPORT_SOUND_SB16 */
{ "AMD-98", NULL },
{ "WaveStar", NULL },
{ "Otomi-chanx2", NULL },
@ -856,6 +888,31 @@ struct retro_core_option_definition option_defs_ja[] = {
},
"2.4576 MHz"
},
{
"np2kai_cpu_feature",
"CPU仕様 (要リスタート)",
NULL,
{
{ "(custom)", NULL },
{ "Intel 80386", NULL },
{ "Intel i486SX", NULL },
{ "Intel i486DX", NULL },
{ "Intel Pentium", NULL },
{ "Intel MMX Pentium", NULL },
{ "Intel Pentium Pro", NULL },
{ "Intel Pentium II", NULL },
{ "Intel Pentium III", NULL },
{ "Intel Pentium M", NULL },
{ "Intel Pentium 4", NULL },
{ "AMD K6-2", NULL },
{ "AMD K6-III", NULL },
{ "AMD K7 Athlon", NULL },
{ "AMD K7 Athlon XP", NULL },
{ "Neko Processor II", NULL },
{ NULL, NULL},
},
"Intel 80386"
},
{
"np2kai_clk_mult",
"CPUクロック倍率 (要リスタート)",
@ -994,20 +1051,27 @@ struct retro_core_option_definition option_defs_ja[] = {
{
{ "PC9801-14", NULL },
{ "PC9801-86", NULL },
{ "PC9801-86 + 118", NULL },
{ "PC9801-86 + 118(B460)", NULL },
{ "PC9801-86 + Mate-X PCM(B460)", NULL },
{ "PC9801-86 + Chibi-oto", NULL },
{ "PC9801-86 + Speak Board", NULL },
{ "PC9801-26K", NULL },
{ "PC9801-26K + 86", NULL },
{ "PC9801-118", NULL },
{ "Mate-X PCM(B460)", NULL },
{ "Mate-X PCM", NULL },
{ "Chibi-oto", NULL },
{ "Speak Board", NULL },
{ "Spark Board", NULL },
{ "Sound Orchestra", NULL },
{ "Sound Orchestra-V", NULL },
#if defined(SUPPORT_SOUND_SB16)
{ "Sound Blaster 16", NULL },
{ "PC9801-86 + Sound Blaster 16", NULL },
{ "Mate-X PCM + Sound Blaster 16", NULL },
{ "PC9801-118 + Sound Blaster 16", NULL },
{ "PC9801-86 + Mate-X PCM(B460) + Sound Blaster 16", NULL },
{ "PC9801-86 + 118(B460) + Sound Blaster 16", NULL },
#endif /* SUPPORT_SOUND_SB16 */
{ "AMD-98", NULL },
{ "WaveStar", NULL },
{ "Otomi-chanx2", NULL },

View File

@ -4,6 +4,9 @@
#endif
#include "strres.h"
#include "np2.h"
#if defined(CPUCORE_IA32)
#include "cpu.h"
#endif
#include "dosio.h"
#include "commng.h"
#include "fontmng.h"
@ -839,3 +842,351 @@ havemmx(void)
return rv;
#endif /* GCC_CPU_ARCH_IA32 */
}
#if defined(CPUCORE_IA32)
int GetCpuTypeIndex(){
if((CPU_FEATURES_ALL & CPU_FEATURES_80386) != CPU_FEATURES_80386) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_80386_FAMILY &&
np2cfg.cpu_model == CPU_80386_MODEL &&
np2cfg.cpu_stepping == CPU_80386_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_80386 &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_80386 &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_80386 &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_80386){
return 1;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_I486SX) != CPU_FEATURES_I486SX) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_I486SX_FAMILY &&
np2cfg.cpu_model == CPU_I486SX_MODEL &&
np2cfg.cpu_stepping == CPU_I486SX_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_I486SX &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_I486SX &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_I486SX &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_I486SX){
return 2;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_I486DX) != CPU_FEATURES_I486DX) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_I486DX_FAMILY &&
np2cfg.cpu_model == CPU_I486DX_MODEL &&
np2cfg.cpu_stepping == CPU_I486DX_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_I486DX &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_I486DX &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_I486DX &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_I486DX){
return 3;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM) != CPU_FEATURES_PENTIUM) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM){
return 4;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_MMX_PENTIUM) != CPU_FEATURES_MMX_PENTIUM) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_MMX_PENTIUM_FAMILY &&
np2cfg.cpu_model == CPU_MMX_PENTIUM_MODEL &&
np2cfg.cpu_stepping == CPU_MMX_PENTIUM_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_MMX_PENTIUM &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_MMX_PENTIUM &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_MMX_PENTIUM &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_MMX_PENTIUM){
return 5;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_PRO) != CPU_FEATURES_PENTIUM_PRO) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_PRO_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_PRO_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_PRO_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_PRO &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_PRO &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_PRO &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_PRO){
return 6;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_II) != CPU_FEATURES_PENTIUM_II) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_II_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_II_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_II_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_II &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_II &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_II &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_II){
return 7;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_III) != CPU_FEATURES_PENTIUM_III) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_III_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_III_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_III_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_III &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_III &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_III &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_III){
return 8;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_M) != CPU_FEATURES_PENTIUM_M) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_M_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_M_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_M_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_M &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_M &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_M &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_M){
return 9;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_4) != CPU_FEATURES_PENTIUM_4) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_4_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_4_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_4_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_4 &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_4 &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_4 &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_4){
return 10;
}
AMDCPUCheck:
if((CPU_FEATURES_ALL & CPU_FEATURES_AMD_K6_2) != CPU_FEATURES_AMD_K6_2 ||
(CPU_FEATURES_EX_ALL & CPU_FEATURES_EX_AMD_K6_2) != CPU_FEATURES_EX_AMD_K6_2) goto NekoCPUCheck;
if(np2cfg.cpu_family == CPU_AMD_K6_2_FAMILY &&
np2cfg.cpu_model == CPU_AMD_K6_2_MODEL &&
np2cfg.cpu_stepping == CPU_AMD_K6_2_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K6_2 &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K6_2 &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K6_2 &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K6_2){
return 15;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_AMD_K6_III) != CPU_FEATURES_AMD_K6_III ||
(CPU_FEATURES_EX_ALL & CPU_FEATURES_EX_AMD_K6_III) != CPU_FEATURES_EX_AMD_K6_III) goto NekoCPUCheck;
if(np2cfg.cpu_family == CPU_AMD_K6_III_FAMILY &&
np2cfg.cpu_model == CPU_AMD_K6_III_MODEL &&
np2cfg.cpu_stepping == CPU_AMD_K6_III_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K6_III &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K6_III &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K6_III &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K6_III){
return 16;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_AMD_K7_ATHLON) != CPU_FEATURES_AMD_K7_ATHLON ||
(CPU_FEATURES_EX_ALL & CPU_FEATURES_EX_AMD_K7_ATHLON) != CPU_FEATURES_EX_AMD_K7_ATHLON) goto NekoCPUCheck;
if(np2cfg.cpu_family == CPU_AMD_K7_ATHLON_FAMILY &&
np2cfg.cpu_model == CPU_AMD_K7_ATHLON_MODEL &&
np2cfg.cpu_stepping == CPU_AMD_K7_ATHLON_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K7_ATHLON &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K7_ATHLON &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K7_ATHLON &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K7_ATHLON){
return 17;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_AMD_K7_ATHLON_XP) != CPU_FEATURES_AMD_K7_ATHLON_XP ||
(CPU_FEATURES_EX_ALL & CPU_FEATURES_EX_AMD_K7_ATHLON_XP) != CPU_FEATURES_EX_AMD_K7_ATHLON_XP) goto NekoCPUCheck;
if(np2cfg.cpu_family == CPU_AMD_K7_ATHLON_XP_FAMILY &&
np2cfg.cpu_model == CPU_AMD_K7_ATHLON_XP_MODEL &&
np2cfg.cpu_stepping == CPU_AMD_K7_ATHLON_XP_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K7_ATHLON_XP &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K7_ATHLON_XP &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K7_ATHLON_XP &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K7_ATHLON_XP){
return 18;
}
NekoCPUCheck:
if(np2cfg.cpu_family == 0 &&
np2cfg.cpu_model == 0 &&
np2cfg.cpu_stepping == 0 &&
np2cfg.cpu_feature == 0 &&
np2cfg.cpu_feature_ex == 0){
return 255;
}
return 0;
}
int SetCpuTypeIndex(UINT index){
switch(index){
case 1:
np2cfg.cpu_family = CPU_80386_FAMILY;
np2cfg.cpu_model = CPU_80386_MODEL;
np2cfg.cpu_stepping = CPU_80386_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_80386;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_80386;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_80386;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_80386;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_80386);
np2cfg.cpu_brandid = CPU_BRAND_ID_80386;
break;
case 2:
np2cfg.cpu_family = CPU_I486SX_FAMILY;
np2cfg.cpu_model = CPU_I486SX_MODEL;
np2cfg.cpu_stepping = CPU_I486SX_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_I486SX;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_I486SX;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_I486SX;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_I486SX;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_I486SX);
np2cfg.cpu_brandid = CPU_BRAND_ID_I486SX;
break;
case 3:
np2cfg.cpu_family = CPU_I486DX_FAMILY;
np2cfg.cpu_model = CPU_I486DX_MODEL;
np2cfg.cpu_stepping = CPU_I486DX_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_I486DX;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_I486DX;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_I486DX;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_I486DX;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_I486DX);
np2cfg.cpu_brandid = CPU_BRAND_ID_I486DX;
break;
case 4:
np2cfg.cpu_family = CPU_PENTIUM_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM;
break;
case 5:
np2cfg.cpu_family = CPU_MMX_PENTIUM_FAMILY;
np2cfg.cpu_model = CPU_MMX_PENTIUM_MODEL;
np2cfg.cpu_stepping = CPU_MMX_PENTIUM_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_MMX_PENTIUM;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_MMX_PENTIUM;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_MMX_PENTIUM;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_MMX_PENTIUM;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_MMX_PENTIUM);
np2cfg.cpu_brandid = CPU_BRAND_ID_MMX_PENTIUM;
break;
case 6:
np2cfg.cpu_family = CPU_PENTIUM_PRO_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_PRO_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_PRO_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_PRO;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_PRO;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_PRO;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_PRO;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_PRO);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_PRO;
break;
case 7:
np2cfg.cpu_family = CPU_PENTIUM_II_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_II_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_II_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_II;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_II;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_II;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_II;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_II);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_II;
break;
case 8:
np2cfg.cpu_family = CPU_PENTIUM_III_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_III_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_III_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_III;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_III;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_III;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_III;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_III);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_III;
break;
case 9:
np2cfg.cpu_family = CPU_PENTIUM_M_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_M_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_M_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_M;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_M;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_M;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_M;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_M);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_M;
break;
case 10:
np2cfg.cpu_family = CPU_PENTIUM_4_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_4_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_4_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_4;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_4;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_4;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_4;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_4);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_4;
break;
case 15:
np2cfg.cpu_family = CPU_AMD_K6_2_FAMILY;
np2cfg.cpu_model = CPU_AMD_K6_2_MODEL;
np2cfg.cpu_stepping = CPU_AMD_K6_2_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_AMD_K6_2;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K6_2;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K6_2;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K6_2;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K6_2);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K6_2;
break;
case 16:
np2cfg.cpu_family = CPU_AMD_K6_III_FAMILY;
np2cfg.cpu_model = CPU_AMD_K6_III_MODEL;
np2cfg.cpu_stepping = CPU_AMD_K6_III_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_AMD_K6_III;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K6_III;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K6_III;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K6_III;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K6_III);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K6_III;
break;
case 17:
np2cfg.cpu_family = CPU_AMD_K7_ATHLON_FAMILY;
np2cfg.cpu_model = CPU_AMD_K7_ATHLON_MODEL;
np2cfg.cpu_stepping = CPU_AMD_K7_ATHLON_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_AMD_K7_ATHLON;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K7_ATHLON;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K7_ATHLON;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K7_ATHLON;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K7_ATHLON);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K7_ATHLON;
break;
case 18:
np2cfg.cpu_family = CPU_AMD_K7_ATHLON_XP_FAMILY;
np2cfg.cpu_model = CPU_AMD_K7_ATHLON_XP_MODEL;
np2cfg.cpu_stepping = CPU_AMD_K7_ATHLON_XP_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_AMD_K7_ATHLON_XP;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K7_ATHLON_XP;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K7_ATHLON_XP;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K7_ATHLON_XP;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K7_ATHLON_XP);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K7_ATHLON_XP;
break;
case 255: // 全機能使用可能
np2cfg.cpu_family = 0;
np2cfg.cpu_model = 0;
np2cfg.cpu_stepping = 0;
np2cfg.cpu_feature = 0;
np2cfg.cpu_feature_ecx = 0;
np2cfg.cpu_feature_ex = 0;
np2cfg.cpu_eflags_mask = 0;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_NEKOPRO);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_NEKOPRO);
np2cfg.cpu_brandid = 0;
break;
default:
return 0;
}
}
#endif

View File

@ -143,5 +143,10 @@ int havemmx(void);
extern UINT8 changescreeninit;
#if defined(CPUCORE_IA32)
extern int GetCpuTypeIndex();
extern int SetCpuTypeIndex(UINT index);
#endif
#endif /* __LIBRETRO__ */

View File

@ -500,12 +500,17 @@ static void sys_cmd(MENUID id) {
break;
case MID_PC9801_86_MX:
np2cfg.SOUND_SW = 0x64;
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_WSS;
update |= SYS_UPDATECFG;
break;
case MID_PC9801_86_118:
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_118;
update |= SYS_UPDATECFG;
break;
case MID_PC9801_MX:
np2cfg.SOUND_SW = 0x60;
np2cfg.SOUND_SW = SOUNDID_MATE_X_PCM;
update |= SYS_UPDATECFG;
break;
@ -515,7 +520,7 @@ static void sys_cmd(MENUID id) {
break;
case MID_SPEAKBOARD86:
np2cfg.SOUND_SW = 0x24;
np2cfg.SOUND_SW = SOUNDID_86_SPEAKBOARD;
update |= SYS_UPDATECFG;
break;
@ -536,7 +541,32 @@ static void sys_cmd(MENUID id) {
#if defined(SUPPORT_SOUND_SB16)
case MID_SB16:
np2cfg.SOUND_SW = 0x41;
np2cfg.SOUND_SW = SOUNDID_SB16;
update |= SYS_UPDATECFG;
break;
case MID_86_SB16:
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_SB16;
update |= SYS_UPDATECFG;
break;
case MID_MX_SB16:
np2cfg.SOUND_SW = SOUNDID_WSS_SB16;
update |= SYS_UPDATECFG;
break;
case MID_118_SB16:
np2cfg.SOUND_SW = SOUNDID_PC_9801_118_SB16;
update |= SYS_UPDATECFG;
break;
case MID_86MXSB16:
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_WSS_SB16;
update |= SYS_UPDATECFG;
break;
case MID_86118SB16:
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_118_SB16;
update |= SYS_UPDATECFG;
break;
#endif /* SUPPORT_SOUND_SB16 */

View File

@ -110,6 +110,11 @@ enum {
MID_SOUNDORCHESTRAV,
#if defined(SUPPORT_SOUND_SB16)
MID_SB16,
MID_86_SB16,
MID_MX_SB16,
MID_118_SB16,
MID_86MXSB16,
MID_86118SB16,
#endif /* SUPPORT_SOUND_SB16 */
MID_AMD98,
MID_WAVESTAR,

View File

@ -106,8 +106,8 @@ static const char str_pc980126k86[] = "PC-9801-26K + 86";
static const char str_pc980186cb[] = "PC-9801-86 + Chibi-oto";
static const char str_pc9801118[] = "PC-9801-118";
static const char str_pc980186mx[] = "PC-9801-86 + Mate-X PCM(B460)";
static const char str_pc980186118[] = "PC-9801-86 + 118";
static const char str_pc9801mx[] = "Mate-X PCM(B460)";
static const char str_pc980186118[] = "PC-9801-86 + 118(B460)";
static const char str_pc9801mx[] = "Mate-X PCM";
static const char str_spreakboard[] = "Speak board";
static const char str_spreakboard86[] = "PC-9801-86 + Speak board";
static const char str_sparkboard[] = "Spark board";
@ -115,6 +115,11 @@ static const char str_sndorchestra[] = "Sound Orchestra";
static const char str_sndorchestrav[] = "Sound Orchestra-V";
#if defined(SUPPORT_SOUND_SB16)
static const char str_sb16[] = "Sound Blaster 16";
static const char str_86sb16[] = "PC-9801-86 + Sound Blaster 16";
static const char str_mxsb16[] = "Mate-X PCM + Sound Blaster 16";
static const char str_118sb16[] = "PC-9801-118 + Sound Blaster 16";
static const char str_86mxsb16[] = "PC-9801-86 + Mate-X PCM(B460) + Sound Blaster 16";
static const char str_86118sb16[] = "PC-9801-86 + 118(B460) + Sound Blaster 16";
#endif /* SUPPORT_SOUND_SB16 */
static const char str_amd98[] = "AMD-98";
static const char str_wavestar[] = "WaveStar";
@ -406,6 +411,11 @@ static const MSYSITEM s_snd[] = {
{str_sndorchestrav, NULL, MID_SOUNDORCHESTRAV, 0},
#if defined(SUPPORT_SOUND_SB16)
{str_sb16, NULL, MID_SB16, 0},
{str_86sb16, NULL, MID_86_SB16, 0},
{str_mxsb16, NULL, MID_MX_SB16, 0},
{str_118sb16, NULL, MID_118_SB16, 0},
{str_86mxsb16, NULL, MID_86MXSB16, 0},
{str_86118sb16, NULL, MID_86118SB16, 0},
#endif /* SUPPORT_SOUND_SB16 */
{str_amd98, NULL, MID_AMD98, 0},
{str_wavestar, NULL, MID_WAVESTAR, 0},

View File

@ -29,10 +29,12 @@
SOUNDID g_nSoundID;
OPL3 g_opl3;
OPL3 g_opl3[OPL3_MAX]; // index: 0=PC-9891-118, 1=Sound Blaster 16, 2=Sound Orchestra
OPNA g_opna[OPNA_MAX];
#ifdef USE_MAME
void *g_mame_opl3[OPL3_MAX] = {0};
#endif
OPL g_opl;
#if defined(SUPPORT_SOUND_SB16)
SB16 g_sb16;
#endif // defined(SUPPORT_SOUND_SB16)
@ -119,7 +121,10 @@ void fmboard_construct(void)
{
opna_construct(&g_opna[i]);
}
opl3_construct(&g_opl3);
for (i = 0; i < NELEMENTS(g_opl3); i++)
{
opl3_construct(&g_opl3[i]);
}
}
/**
@ -133,7 +138,10 @@ void fmboard_destruct(void)
{
opna_destruct(&g_opna[i]);
}
opl3_destruct(&g_opl3);
for (i = 0; i < NELEMENTS(g_opl3); i++)
{
opl3_destruct(&g_opl3[i]);
}
board118_finalize();
#ifdef SUPPORT_SOUND_SB16
@ -159,7 +167,10 @@ void fmboard_reset(const NP2CFG *pConfig, SOUNDID nSoundID)
{
opna_reset(&g_opna[i], 0);
}
opl3_reset(&g_opl3, 0);
for (i = 0; i < NELEMENTS(g_opl3); i++)
{
opl3_reset(&g_opl3[i], 0);
}
}
extfn = NULL;
@ -243,6 +254,34 @@ void fmboard_reset(const NP2CFG *pConfig, SOUNDID nSoundID)
case SOUNDID_SB16:
boardsb16_reset(pConfig);
break;
case SOUNDID_PC_9801_86_SB16:
boardsb16_reset(pConfig);
board86_reset(pConfig, FALSE);
break;
case SOUNDID_WSS_SB16:
boardsb16_reset(pConfig);
board118_reset(pConfig);
break;
case SOUNDID_PC_9801_86_WSS_SB16:
boardsb16_reset(pConfig);
board118_reset(pConfig);
board86_reset(pConfig, FALSE);
break;
break;
case SOUNDID_PC_9801_118_SB16:
boardsb16_reset(pConfig);
board118_reset(pConfig);
break;
case SOUNDID_PC_9801_86_118_SB16:
boardsb16_reset(pConfig);
board118_reset(pConfig);
board86_reset(pConfig, FALSE);
break;
#endif // defined(SUPPORT_SOUND_SB16)
#if defined(SUPPORT_PX)
@ -337,6 +376,33 @@ void fmboard_bind(void) {
case SOUNDID_SB16:
boardsb16_bind();
break;
case SOUNDID_PC_9801_86_SB16:
boardsb16_bind();
board86_bind();
break;
case SOUNDID_WSS_SB16:
boardsb16_bind();
board118_bind();
break;
case SOUNDID_PC_9801_86_WSS_SB16:
boardsb16_bind();
board118_bind();
board86_bind();
break;
case SOUNDID_PC_9801_118_SB16:
boardsb16_bind();
board118_bind();
break;
case SOUNDID_PC_9801_86_118_SB16:
boardsb16_bind();
board118_bind();
board86_bind();
break;
#endif // defined(SUPPORT_SOUND_SB16)
#if defined(SUPPORT_PX)
@ -385,6 +451,11 @@ void fmboard_unbind(void) {
board86_unbind();
break;
case SOUNDID_PC_9801_86_118:
board118_unbind();
board86_unbind();
break;
case SOUNDID_MATE_X_PCM:
board118_unbind();
break;
@ -424,6 +495,33 @@ void fmboard_unbind(void) {
case SOUNDID_SB16:
boardsb16_unbind();
break;
case SOUNDID_PC_9801_86_SB16:
boardsb16_unbind();
board86_unbind();
break;
case SOUNDID_WSS_SB16:
boardsb16_unbind();
board118_unbind();
break;
case SOUNDID_PC_9801_86_WSS_SB16:
boardsb16_unbind();
board118_unbind();
board86_unbind();
break;
case SOUNDID_PC_9801_118_SB16:
boardsb16_unbind();
board118_unbind();
break;
case SOUNDID_PC_9801_86_118_SB16:
boardsb16_unbind();
board118_unbind();
board86_unbind();
break;
#endif // defined(SUPPORT_SOUND_SB16)
#if defined(SUPPORT_PX)

View File

@ -12,12 +12,14 @@
#include "opna.h"
#include "opntimer.h"
#include "pcm86.h"
#include "ct1741io.h"
#if defined(SUPPORT_PX)
#define OPNA_MAX 5
#else /* defined(SUPPORT_PX) */
#define OPNA_MAX 3
#endif /* defined(SUPPORT_PX) */
#define OPL3_MAX 8
typedef struct {
UINT addr;
@ -31,6 +33,9 @@ typedef struct {
UINT16 base;
UINT8 mixsel;
UINT8 mixreg[0x100];
UINT32 mixregexp[0x100];
DSP_INFO dsp_info;
} SB16;
#ifdef __cplusplus
@ -39,11 +44,13 @@ extern "C"
#endif
extern SOUNDID g_nSoundID;
extern OPL3 g_opl3;
extern OPL3 g_opl3[OPL3_MAX];
extern OPNA g_opna[OPNA_MAX];
#ifdef USE_MAME
extern void *g_mame_opl3[OPL3_MAX];
#endif
extern _PCM86 g_pcm86;
extern _CS4231 cs4231;
extern OPL g_opl;
extern SB16 g_sb16;
REG8 fmboard_getjoy(POPNA opna);

122
sound/mame/ymf262.c Executable file → Normal file
View File

@ -51,6 +51,8 @@ differences between OPL2 and OPL3 shown in datasheets:
#define PI 3.14159265358979323846
#endif
// XXX: statsave connect保存用
static INT32 connectBuf[18*2] = {0};
/* output final shift */
@ -610,7 +612,7 @@ static int num_lock = 0;
static INLINE int limit( int val, int max, int min ) {
INLINE int limit( int val, int max, int min ) {
if ( val > max )
val = max;
else if ( val < min )
@ -663,7 +665,7 @@ INLINE void OPL3_STATUSMASK_SET(OPL3 *chip,int flag)
/* advance LFO to next sample */
static INLINE void advance_lfo(OPL3 *chip)
INLINE void advance_lfo(OPL3 *chip)
{
UINT8 tmp;
@ -684,7 +686,7 @@ static INLINE void advance_lfo(OPL3 *chip)
}
/* advance to next sample */
static INLINE void advance(OPL3 *chip)
INLINE void advance(OPL3 *chip)
{
OPL3_CH *CH;
OPL3_SLOT *op;
@ -852,7 +854,7 @@ static INLINE void advance(OPL3 *chip)
}
static INLINE signed int op_calc(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab)
INLINE signed int op_calc(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab)
{
UINT32 p;
@ -863,7 +865,7 @@ static INLINE signed int op_calc(UINT32 phase, unsigned int env, signed int pm,
return tl_tab[p];
}
static INLINE signed int op_calc1(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab)
INLINE signed int op_calc1(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab)
{
UINT32 p;
@ -879,7 +881,7 @@ static INLINE signed int op_calc1(UINT32 phase, unsigned int env, signed int pm,
/* calculate output of a standard 2 operator channel
(or 1st part of a 4-op channel) */
static INLINE void chan_calc( OPL3 *chip, OPL3_CH *CH )
INLINE void chan_calc( OPL3 *chip, OPL3_CH *CH )
{
OPL3_SLOT *SLOT;
unsigned int env;
@ -973,7 +975,7 @@ number number BLK/FNUM2 FNUM Drum Hat Drum Tom Cymbal
/* calculate rhythm */
static INLINE void chan_calc_rhythm( OPL3 *chip, OPL3_CH *CH, unsigned int noise )
INLINE void chan_calc_rhythm( OPL3 *chip, OPL3_CH *CH, unsigned int noise )
{
OPL3_SLOT *SLOT;
signed int out;
@ -1150,7 +1152,7 @@ static int init_tables(void)
for (x=0; x<TL_RES_LEN; x++)
{
m = (1<<16) / pow((double)2, (double)(x+1) * (ENV_STEP/4.0) / 8.0);
m = (1<<16) / pow(2, (x+1) * (ENV_STEP/4.0) / 8.0);
m = floor(m);
/* we never reach (1<<16) here due to the (x+1) */
@ -1372,7 +1374,7 @@ static void OPL3_initalize(OPL3 *chip)
}
static INLINE void FM_KEYON(OPL3_SLOT *SLOT, UINT32 key_set)
INLINE void FM_KEYON(OPL3_SLOT *SLOT, UINT32 key_set)
{
if( !SLOT->key )
{
@ -1384,7 +1386,7 @@ static INLINE void FM_KEYON(OPL3_SLOT *SLOT, UINT32 key_set)
SLOT->key |= key_set;
}
static INLINE void FM_KEYOFF(OPL3_SLOT *SLOT, UINT32 key_clr)
INLINE void FM_KEYOFF(OPL3_SLOT *SLOT, UINT32 key_clr)
{
if( SLOT->key )
{
@ -1400,7 +1402,7 @@ static INLINE void FM_KEYOFF(OPL3_SLOT *SLOT, UINT32 key_clr)
}
/* update phase increment counter of operator (also update the EG rates if necessary) */
static INLINE void CALC_FCSLOT(OPL3_CH *CH,OPL3_SLOT *SLOT)
INLINE void CALC_FCSLOT(OPL3_CH *CH,OPL3_SLOT *SLOT)
{
int ksr;
@ -1435,7 +1437,7 @@ static INLINE void CALC_FCSLOT(OPL3_CH *CH,OPL3_SLOT *SLOT)
}
/* set multi,am,vib,EG-TYP,KSR,mul */
static INLINE void set_mul(OPL3 *chip,int slot,int v)
INLINE void set_mul(OPL3 *chip,int slot,int v)
{
OPL3_CH *CH = &chip->P_CH[slot/2];
OPL3_SLOT *SLOT = &CH->SLOT[slot&1];
@ -1501,7 +1503,7 @@ static INLINE void set_mul(OPL3 *chip,int slot,int v)
}
/* set ksl & tl */
static INLINE void set_ksl_tl(OPL3 *chip,int slot,int v)
INLINE void set_ksl_tl(OPL3 *chip,int slot,int v)
{
OPL3_CH *CH = &chip->P_CH[slot/2];
OPL3_SLOT *SLOT = &CH->SLOT[slot&1];
@ -1567,7 +1569,7 @@ static INLINE void set_ksl_tl(OPL3 *chip,int slot,int v)
}
/* set attack rate & decay rate */
static INLINE void set_ar_dr(OPL3 *chip,int slot,int v)
INLINE void set_ar_dr(OPL3 *chip,int slot,int v)
{
OPL3_CH *CH = &chip->P_CH[slot/2];
OPL3_SLOT *SLOT = &CH->SLOT[slot&1];
@ -1594,7 +1596,7 @@ static INLINE void set_ar_dr(OPL3 *chip,int slot,int v)
}
/* set sustain level & release rate */
static INLINE void set_sl_rr(OPL3 *chip,int slot,int v)
INLINE void set_sl_rr(OPL3 *chip,int slot,int v)
{
OPL3_CH *CH = &chip->P_CH[slot/2];
OPL3_SLOT *SLOT = &CH->SLOT[slot&1];
@ -2502,16 +2504,16 @@ void * YMF262Init(int clock, int rate)
void YMF262Shutdown(void *chip)
{
OPL3Destroy(chip);
OPL3Destroy((OPL3*)chip);
}
void YMF262ResetChip(void *chip)
{
OPL3ResetChip(chip);
OPL3ResetChip((OPL3*)chip);
}
int YMF262Write(void *chip, int a, int v)
{
return OPL3Write(chip, a, v);
return OPL3Write((OPL3*)chip, a, v);
}
unsigned char YMF262Read(void *chip, int a)
@ -2525,24 +2527,96 @@ unsigned char YMF262Read(void *chip, int a)
/* YMF278(OPL4) returns bit2 in LOW and bit1 in HIGH state ??? info from manual - not verified */
return OPL3Read(chip, a);
return OPL3Read((OPL3*)chip, a);
}
int YMF262TimerOver(void *chip, int c)
{
return OPL3TimerOver(chip, c);
return OPL3TimerOver((OPL3*)chip, c);
}
void YMF262SetTimerHandler(void *chip, OPL3_TIMERHANDLER TimerHandler, void *param)
{
OPL3SetTimerHandler(chip, TimerHandler, param);
OPL3SetTimerHandler((OPL3*)chip, TimerHandler, param);
}
void YMF262SetIRQHandler(void *chip,OPL3_IRQHANDLER IRQHandler,void *param)
{
OPL3SetIRQHandler(chip, IRQHandler, param);
OPL3SetIRQHandler((OPL3*)chip, IRQHandler, param);
}
void YMF262SetUpdateHandler(void *chip,OPL3_UPDATEHANDLER UpdateHandler,void *param)
{
OPL3SetUpdateHandler(chip, UpdateHandler, param);
OPL3SetUpdateHandler((OPL3*)chip, UpdateHandler, param);
}
int YMF262FlagSave(void *chip, void *dstbuf)
{
OPL3* opl3 = (OPL3*)chip;
OPL3* opl3dst = (OPL3*)dstbuf;
if(dstbuf!=NULL){
*opl3dst = *opl3;
// XXX: イベントハンドラ系(?)はセーブしない
opl3dst->TimerHandler = NULL;
opl3dst->TimerParam = NULL;
opl3dst->IRQHandler = NULL;
opl3dst->IRQParam = NULL;
opl3dst->UpdateHandler = NULL;
opl3dst->UpdateParam = NULL;
// XXX: connectってなんでポインタになってるんでしょうめんどくさい・・・
{
int ch, slot;
INT32 *opl3connect = (INT32 *)(&(opl3dst[1]));
for(ch=0;ch<18;ch++){
for(slot=0;slot<2;slot++){
int i = ch * 2 + slot;
if(opl3dst->P_CH[ch].SLOT[slot].connect){
opl3connect[i] = *(opl3dst->P_CH[ch].SLOT[slot].connect);
}
}
}
}
}
return sizeof(OPL3) + sizeof(INT32) * 18 * 2;
}
int YMF262FlagLoad(void *chip, void *srcbuf, int size)
{
OPL3* opl3 = (OPL3*)chip;
OPL3* opl3src = (OPL3*)srcbuf;
OPL3 opl3tmp = *opl3;
OPL3_TIMERHANDLER TimerHandler;/* TIMER handler */
void *TimerParam; /* TIMER parameter */
OPL3_IRQHANDLER IRQHandler; /* IRQ handler */
void *IRQParam; /* IRQ parameter */
OPL3_UPDATEHANDLER UpdateHandler;/* stream update handler */
void *UpdateParam;
if(srcbuf==NULL) return 0;
if(size != sizeof(OPL3) + sizeof(INT32) * 18 * 2) return 0;
*opl3 = *opl3src;
// XXX: イベントハンドラ系(?)は変更しない
opl3->TimerHandler = opl3tmp.TimerHandler;
opl3->TimerParam = opl3tmp.TimerParam;
opl3->IRQHandler = opl3tmp.IRQHandler;
opl3->IRQParam = opl3tmp.IRQParam;
opl3->UpdateHandler = opl3tmp.UpdateHandler;
opl3->UpdateParam = opl3tmp.UpdateParam;
// XXX: connectってなんでポインタになってるんでしょうめんどくさい・・・
{
int ch, slot;
INT32 *opl3connect = (INT32 *)(&(opl3src[1]));
for(ch=0;ch<18;ch++){
for(slot=0;slot<2;slot++){
int i = ch * 2 + slot;
if(opl3->P_CH[ch].SLOT[slot].connect){
connectBuf[i] = opl3connect[i];
opl3->P_CH[ch].SLOT[slot].connect = &connectBuf[i];
}
}
}
}
return size;
}
@ -2555,7 +2629,7 @@ void YMF262SetUpdateHandler(void *chip,OPL3_UPDATEHANDLER UpdateHandler,void *pa
*/
void YMF262UpdateOne(void *_chip, OPL3SAMPLE **buffers, int length)
{
OPL3 *chip = _chip;
OPL3 *chip = (OPL3*)_chip;
UINT8 rhythm = chip->rhythm&0x20;
OPL3SAMPLE *ch_a = buffers[0];

View File

@ -32,6 +32,9 @@
#include "maketext.h"
#include "sound.h"
#include "fmboard.h"
#ifdef SUPPORT_SOUND_SB16
#include "ct1741io.h"
#endif
#include "beep.h"
#include "diskimage/fddfile.h"
#include "fdd/fdd_mtr.h"
@ -67,6 +70,13 @@
#include "i386hax/haxcore.h"
#endif
#ifdef USE_MAME
UINT8 YMF262Read(void *chip, INT a);
INT YMF262Write(void *chip, INT a, INT v);
int YMF262FlagSave(void *chip, void *dstbuf);
int YMF262FlagLoad(void *chip, void *srcbuf, int size);
#endif
extern int sxsi_unittbl[];
#if defined(MACOS)
@ -820,7 +830,8 @@ enum
FLAG_AMD98 = 0x0040,
FLAG_PCM86 = 0x0080,
FLAG_CS4231 = 0x0100,
FLAG_OPL3 = 0x0200
FLAG_OPL3 = 0x0200,
FLAG_SB16 = 0x0400
};
/**
@ -845,13 +856,13 @@ static UINT GetSoundFlags(SOUNDID nSoundID)
return FLAG_OPNA1 | FLAG_OPNA2 | FLAG_PCM86;
case SOUNDID_PC_9801_118:
return FLAG_OPNA1 | FLAG_CS4231;
return FLAG_OPNA1 | FLAG_OPL3 | FLAG_CS4231;
case SOUNDID_PC_9801_86_WSS:
return FLAG_OPNA1 | FLAG_PCM86 | FLAG_CS4231;
case SOUNDID_PC_9801_86_118:
return FLAG_OPNA1 | FLAG_OPNA2 | FLAG_PCM86 | FLAG_CS4231;
return FLAG_OPNA1 | FLAG_OPNA2 | FLAG_OPL3 | FLAG_PCM86 | FLAG_CS4231;
case SOUNDID_MATE_X_PCM:
return FLAG_OPNA1 | FLAG_CS4231;
@ -874,6 +885,27 @@ static UINT GetSoundFlags(SOUNDID nSoundID)
case SOUNDID_SOUNDORCHESTRA:
case SOUNDID_SOUNDORCHESTRAV:
return FLAG_OPNA1 | FLAG_OPL3;
#if defined(SUPPORT_SOUND_SB16)
case SOUNDID_SB16:
return FLAG_OPL3 | FLAG_SB16;
case SOUNDID_PC_9801_86_SB16:
return FLAG_OPNA1 | FLAG_PCM86 | FLAG_OPL3 | FLAG_SB16;
case SOUNDID_WSS_SB16:
return FLAG_CS4231 | FLAG_OPL3 | FLAG_SB16;
case SOUNDID_PC_9801_86_WSS_SB16:
return FLAG_OPNA1 | FLAG_PCM86 | FLAG_CS4231 | FLAG_OPL3 | FLAG_SB16;
case SOUNDID_PC_9801_118_SB16:
return FLAG_OPNA1 | FLAG_OPNA2 | FLAG_OPL3 | FLAG_PCM86 | FLAG_CS4231 | FLAG_SB16;
case SOUNDID_PC_9801_86_118_SB16:
return FLAG_OPNA1 | FLAG_OPNA2 | FLAG_PCM86 | FLAG_CS4231 | FLAG_OPL3 | FLAG_SB16;
#endif // defined(SUPPORT_SOUND_SB16)
#if defined(SUPPORT_PX)
case SOUNDID_PX1:
@ -922,7 +954,34 @@ static int flagsave_fm(STFLAGH sfh, const SFENTRY *tbl)
}
if (nSaveFlags & FLAG_OPL3)
{
ret |= opl3_sfsave(&g_opl3, sfh, tbl);
for (i = 0; i < NELEMENTS(g_opl3); i++)
{
ret |= opl3_sfsave(&g_opl3[i], sfh, tbl);
}
#ifdef USE_MAME
{
void* buffer;
SINT32 bufsize = 0;
bufsize = YMF262FlagSave(NULL, NULL);
buffer = malloc(bufsize);
for (i = 0; i < NELEMENTS(g_mame_opl3); i++)
{
if(g_mame_opl3[i]){
YMF262FlagSave(g_mame_opl3[i], buffer);
ret |= statflag_write(sfh, &bufsize, sizeof(SINT32));
ret |= statflag_write(sfh, buffer, bufsize);
}else{
SINT32 tmpsize = 0;
ret |= statflag_write(sfh, &tmpsize, sizeof(SINT32));
}
}
free(buffer);
}
#endif
}
if (nSaveFlags & FLAG_SB16)
{
ret |= statflag_write(sfh, &g_sb16, sizeof(g_sb16));
}
return ret;
}
@ -964,7 +1023,35 @@ static int flagload_fm(STFLAGH sfh, const SFENTRY *tbl)
}
if (nSaveFlags & FLAG_OPL3)
{
ret |= opl3_sfload(&g_opl3, sfh, tbl);
for (i = 0; i < NELEMENTS(g_opl3); i++)
{
ret |= opl3_sfload(&g_opl3[i], sfh, tbl);
}
#ifdef USE_MAME
for (i = 0; i < NELEMENTS(g_mame_opl3); i++)
{
void* buffer;
int bufsize = 0;
ret |= statflag_read(sfh, &bufsize, sizeof(SINT32));
if(bufsize!=0){
if(YMF262FlagSave(NULL, NULL) != bufsize){
ret = STATFLAG_FAILURE;
break;
}else{
buffer = malloc(bufsize);
ret |= statflag_read(sfh, buffer, bufsize);
if(g_mame_opl3[i]){
YMF262FlagLoad(g_mame_opl3[i], buffer, bufsize);
}
free(buffer);
}
}
}
#endif
}
if (nSaveFlags & FLAG_SB16)
{
ret |= statflag_read(sfh, &g_sb16, sizeof(g_sb16));
}
// 復元。 これ移動すること!

View File

@ -27,6 +27,9 @@ static const PROCTBL evtproc[] = {
{PROCID('e','c','s','d'), cs4231_dma},
{PROCID('e','p','8','6'), pcm86_cb},
{PROCID('e','a','m','d'), amd98int},
#ifdef SUPPORT_SOUND_SB16
{PROCID('e','c','t','d'), ct1741_dma},
#endif
#endif
#if defined(SUPPORT_SASI)
{PROCID('e','s','a','s'), sasiioint},
@ -64,6 +67,9 @@ static const ENUMTBL evtnum[] = {
{PROCID('p','c','m','8'), NEVENT_86PCM},
{PROCID('s','a','s','i'), NEVENT_SASIIO},
{PROCID('s','c','s','i'), NEVENT_SCSIIO},
#ifdef SUPPORT_SOUND_SB16
{PROCID('1','7','4','1'), NEVENT_CT1741},
#endif
};
static const PROCTBL dmaproc[] = {
@ -75,6 +81,9 @@ static const PROCTBL dmaproc[] = {
{PROCID('d','e','f','d'), fdc_dmafunc},
#if !defined(DISABLE_SOUND)
{PROCID('d','e','c','s'), cs4231dmafunc},
#if defined(SUPPORT_SOUND_SB16)
{PROCID('d','e','c','t'), ct1741dmafunc},
#endif
#endif
#if defined(SUPPORT_SASI)
{PROCID('d','o','s','a'), sasi_dataread},

View File

@ -5039,23 +5039,44 @@ LOGPALETTE * NewLogPal(const uint8_t *pCirrusPalette , int iSize) {
void ConvertYUV2RGB(int width, unsigned char *srcYUV16, unsigned char *dstRGB32Line){
int j;
int offset = 128;
for(j=0;j<width/2;j++){
int u0 = srcYUV16[j * 4 + 0];
int y0 = srcYUV16[j * 4 + 1];
int v0 = srcYUV16[j * 4 + 2];
int y1 = srcYUV16[j * 4 + 3];
int r0 = (298 * (y0 - 16) + 409 * (v0 - offset) + 128) >> 8;
int g0 = (298 * (y0 - 16) - 100 * (u0 - offset) - 208 * (v0 - offset) + 128) >> 8;
int b0 = (298 * (y0 - 16) + 516 * (u0 - offset) + 128) >> 8;
int r1 = (298 * (y1 - 16) + 409 * (v0 - offset) + 128) >> 8;
int g1 = (298 * (y1 - 16) - 100 * (u0 - offset) - 208 * (v0 - offset) + 128) >> 8;
int b1 = (298 * (y1 - 16) + 516 * (u0 - offset) + 128) >> 8;
dstRGB32Line[j*8 + 0] = (b0 < 0 ? 0 : (b0 > 255 ? 255 : b0));
dstRGB32Line[j*8 + 1] = (g0 < 0 ? 0 : (g0 > 255 ? 255 : g0));
dstRGB32Line[j*8 + 2] = (r0 < 0 ? 0 : (r0 > 255 ? 255 : r0));
dstRGB32Line[j*8 + 4] = (b1 < 0 ? 0 : (b1 > 255 ? 255 : b1));
dstRGB32Line[j*8 + 5] = (g1 < 0 ? 0 : (g1 > 255 ? 255 : g1));
dstRGB32Line[j*8 + 6] = (r1 < 0 ? 0 : (r1 > 255 ? 255 : r1));
if(cirrusvga->cr[0x3f] & 0x10){
for(j=0;j<width/2;j++){
int u0 = srcYUV16[j * 4 + 0];
int v0 = srcYUV16[j * 4 + 1];
int y1 = srcYUV16[j * 4 + 2];
int y0 = srcYUV16[j * 4 + 3];
int r0 = (298 * (y0 - 16) + 409 * (v0 - offset) + 128) >> 8;
int g0 = (298 * (y0 - 16) - 100 * (u0 - offset) - 208 * (v0 - offset) + 128) >> 8;
int b0 = (298 * (y0 - 16) + 516 * (u0 - offset) + 128) >> 8;
int r1 = (298 * (y1 - 16) + 409 * (v0 - offset) + 128) >> 8;
int g1 = (298 * (y1 - 16) - 100 * (u0 - offset) - 208 * (v0 - offset) + 128) >> 8;
int b1 = (298 * (y1 - 16) + 516 * (u0 - offset) + 128) >> 8;
dstRGB32Line[j*8 + 0] = (b0 < 0 ? 0 : (b0 > 255 ? 255 : b0));
dstRGB32Line[j*8 + 1] = (g0 < 0 ? 0 : (g0 > 255 ? 255 : g0));
dstRGB32Line[j*8 + 2] = (r0 < 0 ? 0 : (r0 > 255 ? 255 : r0));
dstRGB32Line[j*8 + 4] = (b1 < 0 ? 0 : (b1 > 255 ? 255 : b1));
dstRGB32Line[j*8 + 5] = (g1 < 0 ? 0 : (g1 > 255 ? 255 : g1));
dstRGB32Line[j*8 + 6] = (r1 < 0 ? 0 : (r1 > 255 ? 255 : r1));
}
}else{
for(j=0;j<width/2;j++){
int u0 = srcYUV16[j * 4 + 0];
int y0 = srcYUV16[j * 4 + 1];
int v0 = srcYUV16[j * 4 + 2];
int y1 = srcYUV16[j * 4 + 3];
int r0 = (298 * (y0 - 16) + 409 * (v0 - offset) + 128) >> 8;
int g0 = (298 * (y0 - 16) - 100 * (u0 - offset) - 208 * (v0 - offset) + 128) >> 8;
int b0 = (298 * (y0 - 16) + 516 * (u0 - offset) + 128) >> 8;
int r1 = (298 * (y1 - 16) + 409 * (v0 - offset) + 128) >> 8;
int g1 = (298 * (y1 - 16) - 100 * (u0 - offset) - 208 * (v0 - offset) + 128) >> 8;
int b1 = (298 * (y1 - 16) + 516 * (u0 - offset) + 128) >> 8;
dstRGB32Line[j*8 + 0] = (b0 < 0 ? 0 : (b0 > 255 ? 255 : b0));
dstRGB32Line[j*8 + 1] = (g0 < 0 ? 0 : (g0 > 255 ? 255 : g0));
dstRGB32Line[j*8 + 2] = (r0 < 0 ? 0 : (r0 > 255 ? 255 : r0));
dstRGB32Line[j*8 + 4] = (b1 < 0 ? 0 : (b1 > 255 ? 255 : b1));
dstRGB32Line[j*8 + 5] = (g1 < 0 ? 0 : (g1 > 255 ? 255 : g1));
dstRGB32Line[j*8 + 6] = (r1 < 0 ? 0 : (r1 > 255 ? 255 : r1));
}
}
}
@ -5172,7 +5193,7 @@ void cirrusvga_drawGraphic(){
#if defined(SUPPORT_VGA_MODEX)
// PC/AT MODE X compatible
if (np2clvga.gd54xxtype == CIRRUS_98ID_PCI){
if (np2clvga.gd54xxtype <= 0xff){
static UINT8 lastmodex = 0;
if(np2clvga.modex){
if(!lastmodex){
@ -5667,7 +5688,6 @@ void cirrusvga_drawGraphic(){
#if !defined(NP2_X11) && !defined(NP2_SDL2) && !defined(__LIBRETRO__)
switch(vidwnd_format){
case 0: // YUV 4:2:2 UYVY
// TODO: YUVとかも作らないといけないけどどうするよ
vidwnd_yuv = 1;
vidwnd_bpp = 32;
break;
@ -7170,6 +7190,28 @@ static void pc98_cirrus_deinit_common(CirrusVGAState * s, int device_id, int is_
iocore_detachout(0xdaa); // 0x3DA
iocore_detachinp(0xdaa); // 0x3DA
#ifdef SUPPORT_VGA_MODEX
if(np2cfg.usemodex){
for(i=0;i<16;i++){
iocore_attachout(0x3c0 + i, vga_ioport_write_wrap);
iocore_attachinp(0x3c0 + i, vga_ioport_read_wrap);
}
iocore_attachout(0x3b4, vga_ioport_write_wrap);
iocore_attachinp(0x3b4, vga_ioport_read_wrap);
iocore_attachout(0x3b5, vga_ioport_write_wrap);
iocore_attachinp(0x3b5, vga_ioport_read_wrap);
iocore_attachout(0x3ba, vga_ioport_write_wrap);
iocore_attachinp(0x3ba, vga_ioport_read_wrap);
iocore_attachout(0x3d4, vga_ioport_write_wrap);
iocore_attachinp(0x3d4, vga_ioport_read_wrap);
iocore_attachout(0x3d5, vga_ioport_write_wrap);
iocore_attachinp(0x3d5, vga_ioport_read_wrap);
iocore_attachout(0x3da, vga_ioport_write_wrap);
iocore_attachinp(0x3da, vga_ioport_read_wrap);
}
#endif
}
}
}

View File

@ -61,6 +61,8 @@ struct _commng
UINT connect; /*!< flags */
UINT (*read)(COMMNG self, UINT8 *data); /*!< read */
UINT (*write)(COMMNG self, UINT8 data); /*!< write */
UINT (*writeretry)(COMMNG self); /*!< write retry */
UINT (*lastwritesuccess)(COMMNG self); /*!< last write success */
UINT8 (*getstat)(COMMNG self); /*!< get status */
INTPTR (*msg)(COMMNG self, UINT msg, INTPTR param); /*!< message */
void (*release)(COMMNG self); /*!< release */

54
win9x/commng/cmbase.cpp Executable file → Normal file
View File

@ -1,27 +1,29 @@
/**
* @file cmbase.h
* @brief commng
* @brief commng
*/
#include "compiler.h"
#include "cmbase.h"
/**
*
* @param[in] nConnect
*
* @param[in] nConnect
*/
CComBase::CComBase(UINT nConnect)
{
this->connect = nConnect;
this->read = cRead;
this->write = cWrite;
this->writeretry = cWriteRetry;
this->lastwritesuccess = cLastWriteSuccess;
this->getstat = cGetStat;
this->msg = cMessage;
this->release = cRelease;
}
/**
*
*
*/
CComBase::~CComBase()
{
@ -29,7 +31,7 @@ CComBase::~CComBase()
/**
* Read
* @param[in] cm COMMNG
* @param[in] cm COMMNG
* @param[out] pData
* @return result
*/
@ -40,7 +42,7 @@ UINT CComBase::cRead(COMMNG cm, UINT8* pData)
/**
* Write
* @param[in] cm COMMNG
* @param[in] cm COMMNG
* @param[in] cData
* @return result
*/
@ -50,9 +52,29 @@ UINT CComBase::cWrite(COMMNG cm, UINT8 cData)
}
/**
*
* @param[in] cm COMMNG
* @return
* Write Retry
* @param[in] cm COMMNG
* @return result
*/
UINT CComBase::cWriteRetry(COMMNG cm)
{
return static_cast<CComBase*>(cm)->WriteRetry();
}
/**
* Last Write Success
* @param[in] cm COMMNG
* @return result
*/
UINT CComBase::cLastWriteSuccess(COMMNG cm)
{
return static_cast<CComBase*>(cm)->LastWriteSuccess();
}
/**
*
* @param[in] cm COMMNG
* @return
*/
UINT8 CComBase::cGetStat(COMMNG cm)
{
@ -60,11 +82,11 @@ UINT8 CComBase::cGetStat(COMMNG cm)
}
/**
*
* @param[in] cm COMMNG
* @param[in] nMessage
* @param[in] nParam
* @return
*
* @param[in] cm COMMNG
* @param[in] nMessage
* @param[in] nParam
* @return
*/
INTPTR CComBase::cMessage(COMMNG cm, UINT nMessage, INTPTR nParam)
{
@ -72,8 +94,8 @@ INTPTR CComBase::cMessage(COMMNG cm, UINT nMessage, INTPTR nParam)
}
/**
*
* @param[in] cm COMMNG
*
* @param[in] cm COMMNG
*/
void CComBase::cRelease(COMMNG cm)
{

34
win9x/commng/cmbase.h Executable file → Normal file
View File

@ -1,6 +1,6 @@
/**
* @file cmbase.h
* @brief commng
* @brief commng
*/
#pragma once
@ -8,7 +8,7 @@
#include "commng.h"
/**
* @brief commng
* @brief commng
*/
class CComBase : public _commng
{
@ -29,24 +29,42 @@ protected:
* @return result
*/
virtual UINT Write(UINT8 cData) = 0;
/**
* Write Retry
* @return result
*/
virtual UINT WriteRetry(){
return 1; // 常時成功扱い
}
/**
* Last Write Success
* @return result
*/
virtual UINT LastWriteSuccess(){
return 1; // 常時成功扱い
}
/**
*
* @return
*
* @return
*/
virtual UINT8 GetStat() = 0;
/**
*
* @param[in] nMessage
* @param[in] nParam
* @return
*
* @param[in] nMessage
* @param[in] nParam
* @return
*/
virtual INTPTR Message(UINT nMessage, INTPTR nParam) = 0;
private:
static UINT cRead(COMMNG cm, UINT8* pData);
static UINT cWrite(COMMNG cm, UINT8 cData);
static UINT cWriteRetry(COMMNG cm);
static UINT cLastWriteSuccess(COMMNG cm);
static UINT8 cGetStat(COMMNG cm);
static INTPTR cMessage(COMMNG cm, UINT nMessage, INTPTR nParam);
static void cRelease(COMMNG cm);

View File

@ -33,6 +33,8 @@ CComPipe::CComPipe()
: CComBase(COMCONNECT_SERIAL)
, m_hSerial(INVALID_HANDLE_VALUE)
, m_isserver(false)
, m_lastdata(0)
, m_lastdatafail(0)
{
}
@ -147,20 +149,69 @@ UINT CComPipe::Read(UINT8* pData)
*/
UINT CComPipe::Write(UINT8 cData)
{
LPTSTR lpMsgBuf;
UINT ret;
DWORD dwWrittenSize;
DWORD errornum;
if (m_hSerial == INVALID_HANDLE_VALUE) {
m_lastdatafail = 1;
return 0;
}
ret = (::WriteFile(m_hSerial, &cData, 1, &dwWrittenSize, NULL)) ? 1 : 0;
if(dwWrittenSize==0) {
if(m_lastdatafail && GetTickCount() - m_lastdatatime > 1000){
return 1; // バッファデータが減りそうにないならあきらめる毎秒1byte(8bit)は流石にあり得ない)
}
m_lastdatafail = 1;
m_lastdata = cData;
m_lastdatatime = GetTickCount();
return 0;
}else{
m_lastdatafail = 0;
m_lastdata = 0;
m_lastdatatime = 0;
}
return ret;
}
/**
*
* @return
*/
UINT CComPipe::WriteRetry()
{
UINT ret;
DWORD dwWrittenSize;
if(m_lastdatafail){
if (GetTickCount() - m_lastdatatime > 1000) return 1; // バッファデータが減りそうにないならあきらめる毎秒1byte(8bit)は流石にあり得ない)
if (m_hSerial == INVALID_HANDLE_VALUE) {
return 0;
}
ret = (::WriteFile(m_hSerial, &m_lastdata, 1, &dwWrittenSize, NULL)) ? 1 : 0;
if(dwWrittenSize==0) {
return 0;
}
m_lastdatafail = 0;
m_lastdata = 0;
m_lastdatatime = 0;
return ret;
}
return 1;
}
/**
*
* @return
*/
UINT CComPipe::LastWriteSuccess()
{
if(m_lastdatafail && GetTickCount() - m_lastdatatime > 3000){
return 1; // 3秒間バッファデータが減りそうにないならあきらめる
}
if(m_lastdatafail){
return 0;
}
return 1;
}
/**
*
* @return
@ -178,11 +229,11 @@ UINT8 CComPipe::GetStat()
*/
INTPTR CComPipe::Message(UINT nMessage, INTPTR nParam)
{
switch (nMessage)
{
default:
break;
}
//switch (nMessage)
//{
// default:
// break;
//}
return 0;
}

View File

@ -22,6 +22,8 @@ protected:
virtual ~CComPipe();
virtual UINT Read(UINT8* pData);
virtual UINT Write(UINT8 cData);
virtual UINT WriteRetry(); // 書き込み損なっていたら再書き込みする
virtual UINT LastWriteSuccess(); // 最後の書き込みが成功しているかチェック
virtual UINT8 GetStat();
virtual INTPTR Message(UINT nMessage, INTPTR nParam);
@ -30,6 +32,9 @@ private:
bool m_isserver; /*!< サーバーかどうか */
OEMCHAR m_pipename[MAX_PATH]; // The name of the named-pipe
OEMCHAR m_pipeserv[MAX_PATH]; // The server name of the named-pipe
UINT8 m_lastdata; // 最後に送ろうとしたデータ
UINT8 m_lastdatafail; // データを送るのに失敗していたら0以外
DWORD m_lastdatatime; // データを送るのに失敗した時間(あまりにも失敗し続けるようなら無視する)
bool Initialize(LPCTSTR pipename, LPCTSTR servername);
};

119
win9x/commng/cmserial.cpp Executable file → Normal file
View File

@ -1,23 +1,23 @@
/**
* @file cmserial.cpp
* @brief
* @brief
*/
#include "compiler.h"
#include "cmserial.h"
/**
*
*
*/
const UINT32 cmserial_speed[11] = {110, 300, 600, 1200, 2400, 4800,
9600, 19200, 38400, 57600, 115200};
/**
*
* @param[in] nPort
* @param[in] cParam
* @param[in] nSpeed
* @return
*
* @param[in] nPort
* @param[in] cParam
* @param[in] nSpeed
* @return
*/
CComSerial* CComSerial::CreateInstance(UINT nPort, UINT8 cParam, UINT32 nSpeed, UINT8 fixedspeed)
{
@ -31,16 +31,18 @@ CComSerial* CComSerial::CreateInstance(UINT nPort, UINT8 cParam, UINT32 nSpeed,
}
/**
*
*
*/
CComSerial::CComSerial()
: CComBase(COMCONNECT_SERIAL)
, m_hSerial(INVALID_HANDLE_VALUE)
, m_lastdata(0)
, m_lastdatafail(0)
{
}
/**
*
*
*/
CComSerial::~CComSerial()
{
@ -52,12 +54,12 @@ CComSerial::~CComSerial()
}
/**
*
* @param[in] nPort
* @param[in] cParam
* @param[in] nSpeed
* @retval true
* @retval false
*
* @param[in] nPort
* @param[in] cParam
* @param[in] nSpeed
* @retval true
* @retval false
*/
bool CComSerial::Initialize(UINT nPort, UINT8 cParam, UINT32 nSpeed, UINT8 fixedspeed)
{
@ -119,9 +121,9 @@ bool CComSerial::Initialize(UINT nPort, UINT8 cParam, UINT32 nSpeed, UINT8 fixed
}
/**
*
* @param[out] pData
* @return
*
* @param[out] pData
* @return
*/
UINT CComSerial::Read(UINT8* pData)
{
@ -140,19 +142,78 @@ UINT CComSerial::Read(UINT8* pData)
}
/**
*
* @param[out] cData
* @return
*
* @param[out] cData
* @return
*/
UINT CComSerial::Write(UINT8 cData)
{
UINT ret;
DWORD dwWrittenSize;
return (::WriteFile(m_hSerial, &cData, 1, &dwWrittenSize, NULL)) ? 1 : 0;
if (m_hSerial == INVALID_HANDLE_VALUE) {
m_lastdatafail = 1;
return 0;
}
ret = (::WriteFile(m_hSerial, &cData, 1, &dwWrittenSize, NULL)) ? 1 : 0;
if(dwWrittenSize==0) {
if(m_lastdatafail && GetTickCount() - m_lastdatatime > 3000){
return 1; // 3秒間バッファデータが減りそうにないならあきらめる
}
m_lastdatafail = 1;
m_lastdata = cData;
m_lastdatatime = GetTickCount();
return 0;
}else{
m_lastdatafail = 0;
m_lastdata = 0;
m_lastdatatime = 0;
}
return ret;
}
/**
*
* @return
*
* @return
*/
UINT CComSerial::WriteRetry()
{
UINT ret;
DWORD dwWrittenSize;
if(m_lastdatafail){
if (GetTickCount() - m_lastdatatime > 3000) return 1; // 3秒間バッファデータが減りそうにないならあきらめる
if (m_hSerial == INVALID_HANDLE_VALUE) {
return 0;
}
ret = (::WriteFile(m_hSerial, &m_lastdata, 1, &dwWrittenSize, NULL)) ? 1 : 0;
if(dwWrittenSize==0) {
return 0;
}
m_lastdatafail = 0;
m_lastdata = 0;
m_lastdatatime = 0;
return ret;
}
return 1;
}
/**
*
* @return
*/
UINT CComSerial::LastWriteSuccess()
{
if(m_lastdatafail && GetTickCount() - m_lastdatatime > 3000){
return 1; // 3秒間バッファデータが減りそうにないならあきらめる
}
if(m_lastdatafail){
return 0;
}
return 1;
}
/**
*
* @return
*/
UINT8 CComSerial::GetStat()
{
@ -169,10 +230,10 @@ UINT8 CComSerial::GetStat()
}
/**
*
* @param[in] nMessage
* @param[in] nParam
* @return
*
* @param[in] nMessage
* @param[in] nParam
* @return
*/
INTPTR CComSerial::Message(UINT nMessage, INTPTR nParam)
{
@ -200,7 +261,7 @@ INTPTR CComSerial::Message(UINT nMessage, INTPTR nParam)
case COMMSG_CHANGEMODE:
if(!m_fixedspeed){
bool changed = false;
UINT8 newmode = *(reinterpret_cast<UINT8*>(nParam)); // I/O 32h モードセットのデータ
UINT8 newmode = *(reinterpret_cast<UINT8*>(nParam)); // I/O 32h モードセットのデータ
BYTE stopbits_value[] = {ONESTOPBIT, ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS};
BYTE parity_value[] = {NOPARITY, ODDPARITY, NOPARITY, EVENPARITY};
BYTE bytesize_value[] = {5, 6, 7, 8};

13
win9x/commng/cmserial.h Executable file → Normal file
View File

@ -1,6 +1,6 @@
/**
* @file cmserial.h
* @brief
* @brief
*/
#pragma once
@ -10,7 +10,7 @@
extern const UINT32 cmserial_speed[11];
/**
* @brief commng
* @brief commng
*/
class CComSerial : public CComBase
{
@ -22,13 +22,18 @@ protected:
virtual ~CComSerial();
virtual UINT Read(UINT8* pData);
virtual UINT Write(UINT8 cData);
virtual UINT WriteRetry();
virtual UINT LastWriteSuccess(); // 最後の書き込みが成功しているかチェック
virtual UINT8 GetStat();
virtual INTPTR Message(UINT nMessage, INTPTR nParam);
private:
HANDLE m_hSerial; /*!< シリアル ハンドル */
HANDLE m_hSerial; /*!< シリアル ハンドル */
bool m_fixedspeed; /*!< 通信速度固定 */
bool m_fixedspeed; /*!< 通信速度固定 */
UINT8 m_lastdata; // 最後に送ろうとしたデータ
UINT8 m_lastdatafail; // データを送るのに失敗していたら0以外
DWORD m_lastdatatime; // データを送るのに失敗した時間(あまりにも失敗し続けるようなら無視する)
bool Initialize(UINT nPort, UINT8 cParam, UINT32 nSpeed, UINT8 fixedspeed);
};

View File

@ -818,7 +818,7 @@ UINT CComWacom::Write(UINT8 cData)
}
#endif
}
return 0;
return 1;
}
/**

195
win9x/dialog/d_config.cpp Executable file → Normal file
View File

@ -1,6 +1,6 @@
/**
* @file d_config.cpp
* @brief
* @brief
*/
#include "compiler.h"
@ -25,8 +25,8 @@
#endif
/**
* @brief
* @param[in] hwndParent
* @brief
* @param[in] hwndParent
*/
class CConfigureDlg : public CDlgProc
{
@ -39,13 +39,13 @@ protected:
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
private:
CComboData m_baseClock; //!< ベース クロック
CComboData m_multiple; //!< 倍率
CComboData m_cputype; //!< CPU種類
CComboData m_type; //!< タイプ
CComboData m_name; //!< デバイス名
CComboData m_rate; //!< レート
CWndProc m_chk21port; //!< PC-9821ポートマップ
CComboData m_baseClock; //!< ベース クロック
CComboData m_multiple; //!< 倍率
CComboData m_cputype; //!< CPU種類
CComboData m_type; //!< タイプ
CComboData m_name; //!< デバイス名
CComboData m_rate; //!< レート
CWndProc m_chk21port; //!< PC-9821ポートマップ
std::vector<LPCTSTR> m_dsound3; //!< DSound3
std::vector<LPCTSTR> m_wasapi; //!< WASAPI
std::vector<LPCTSTR> m_asio; //!< ASIO
@ -56,26 +56,27 @@ private:
int SetCpuTypeIndex(UINT index);
};
//! コンボ ボックス アイテム
//! コンボ ボックス アイテム
static const CComboData::Entry s_baseclock[] =
{
{MAKEINTRESOURCE(IDS_2_0MHZ), PCBASECLOCK20},
{MAKEINTRESOURCE(IDS_2_5MHZ), PCBASECLOCK25},
};
//! CPU種類 コンボ ボックス アイテム
//! CPU種類 コンボ ボックス アイテム
static const CComboData::Entry s_cputype[] =
{
{MAKEINTRESOURCE(IDS_CPU_CUSTOM), 0},
{MAKEINTRESOURCE(IDS_CPU_I486SX), 1},
{MAKEINTRESOURCE(IDS_CPU_I486DX), 2},
{MAKEINTRESOURCE(IDS_CPU_PENTIUM), 3},
{MAKEINTRESOURCE(IDS_CPU_MMXPENTIUM), 4},
{MAKEINTRESOURCE(IDS_CPU_PENTIUMPRO), 5},
{MAKEINTRESOURCE(IDS_CPU_PENTIUMII), 6},
{MAKEINTRESOURCE(IDS_CPU_PENTIUMIII), 7},
{MAKEINTRESOURCE(IDS_CPU_PENTIUMM), 8},
{MAKEINTRESOURCE(IDS_CPU_PENTIUM4), 9},
{MAKEINTRESOURCE(IDS_CPU_80386), 1},
{MAKEINTRESOURCE(IDS_CPU_I486SX), 2},
{MAKEINTRESOURCE(IDS_CPU_I486DX), 3},
{MAKEINTRESOURCE(IDS_CPU_PENTIUM), 4},
{MAKEINTRESOURCE(IDS_CPU_MMXPENTIUM), 5},
{MAKEINTRESOURCE(IDS_CPU_PENTIUMPRO), 6},
{MAKEINTRESOURCE(IDS_CPU_PENTIUMII), 7},
{MAKEINTRESOURCE(IDS_CPU_PENTIUMIII), 8},
{MAKEINTRESOURCE(IDS_CPU_PENTIUMM), 9},
{MAKEINTRESOURCE(IDS_CPU_PENTIUM4), 10},
{MAKEINTRESOURCE(IDS_CPU_AMD_K6_2), 15},
{MAKEINTRESOURCE(IDS_CPU_AMD_K6_III), 16},
{MAKEINTRESOURCE(IDS_CPU_AMD_K7_ATHLON), 17},
@ -87,19 +88,19 @@ static const CComboData::Entry s_cputype_286[] =
{MAKEINTRESOURCE(IDS_CPU_80286), 0},
};
//! 倍率リスト
//! 倍率リスト
static const UINT32 s_mulval[] = {1, 2, 4, 5, 6, 8, 10, 12, 16, 20, 24, 30, 32, 34, 36,
40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90};
//! クロック フォーマット
//! クロック フォーマット
static const TCHAR str_clockfmt[] = _T("%2u.%.4u");
//! サンプリング レート
//! サンプリング レート
static const UINT32 s_nSamplingRate[] = {11025, 22050, 44100, 48000, 88200, 96000};
/**
*
* @param[in] hwndParent
*
* @param[in] hwndParent
*/
CConfigureDlg::CConfigureDlg(HWND hwndParent)
: CDlgProc(IDD_CONFIG, hwndParent)
@ -107,9 +108,9 @@ CConfigureDlg::CConfigureDlg(HWND hwndParent)
}
/**
* WM_INITDIALOG
* @retval TRUE
* @retval FALSE
* WM_INITDIALOG
* @retval TRUE
* @retval FALSE
*/
BOOL CConfigureDlg::OnInitDialog()
{
@ -166,7 +167,7 @@ BOOL CConfigureDlg::OnInitDialog()
m_chk21port.EnableWindow(FALSE);
#endif
// サウンド関係
// サウンド関係
m_type.SubclassDlgItem(IDC_SOUND_DEVICE_TYPE, this);
CSoundDeviceDSound3::EnumerateDevices(m_dsound3);
@ -263,7 +264,7 @@ BOOL CConfigureDlg::OnInitDialog()
}
/**
*
*
*/
void CConfigureDlg::UpdateDeviceList()
{
@ -307,17 +308,29 @@ void CConfigureDlg::UpdateDeviceList()
}
/**
* np2cfg CPUID -> CPU type index
* np2cfg CPUID -> CPU type index
*/
int CConfigureDlg::GetCpuTypeIndex(){
#if defined(CPUCORE_IA32)
if((CPU_FEATURES_ALL & CPU_FEATURES_80386) != CPU_FEATURES_80386) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_80386_FAMILY &&
np2cfg.cpu_model == CPU_80386_MODEL &&
np2cfg.cpu_stepping == CPU_80386_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_80386 &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_80386 &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_80386 &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_80386){
return 1;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_I486SX) != CPU_FEATURES_I486SX) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_I486SX_FAMILY &&
np2cfg.cpu_model == CPU_I486SX_MODEL &&
np2cfg.cpu_stepping == CPU_I486SX_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_I486SX &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_I486SX &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_I486SX){
return 1;
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_I486SX &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_I486SX){
return 2;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_I486DX) != CPU_FEATURES_I486DX) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_I486DX_FAMILY &&
@ -325,8 +338,9 @@ int CConfigureDlg::GetCpuTypeIndex(){
np2cfg.cpu_stepping == CPU_I486DX_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_I486DX &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_I486DX &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_I486DX){
return 2;
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_I486DX &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_I486DX){
return 3;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM) != CPU_FEATURES_PENTIUM) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_FAMILY &&
@ -334,8 +348,9 @@ int CConfigureDlg::GetCpuTypeIndex(){
np2cfg.cpu_stepping == CPU_PENTIUM_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM){
return 3;
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM){
return 4;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_MMX_PENTIUM) != CPU_FEATURES_MMX_PENTIUM) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_MMX_PENTIUM_FAMILY &&
@ -343,8 +358,9 @@ int CConfigureDlg::GetCpuTypeIndex(){
np2cfg.cpu_stepping == CPU_MMX_PENTIUM_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_MMX_PENTIUM &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_MMX_PENTIUM &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_MMX_PENTIUM){
return 4;
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_MMX_PENTIUM &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_MMX_PENTIUM){
return 5;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_PRO) != CPU_FEATURES_PENTIUM_PRO) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_PRO_FAMILY &&
@ -352,8 +368,9 @@ int CConfigureDlg::GetCpuTypeIndex(){
np2cfg.cpu_stepping == CPU_PENTIUM_PRO_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_PRO &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_PRO &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_PRO){
return 5;
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_PRO &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_PRO){
return 6;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_II) != CPU_FEATURES_PENTIUM_II) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_II_FAMILY &&
@ -361,8 +378,9 @@ int CConfigureDlg::GetCpuTypeIndex(){
np2cfg.cpu_stepping == CPU_PENTIUM_II_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_II &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_II &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_II){
return 6;
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_II &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_II){
return 7;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_III) != CPU_FEATURES_PENTIUM_III) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_III_FAMILY &&
@ -370,8 +388,9 @@ int CConfigureDlg::GetCpuTypeIndex(){
np2cfg.cpu_stepping == CPU_PENTIUM_III_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_III &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_III &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_III){
return 7;
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_III &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_III){
return 8;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_M) != CPU_FEATURES_PENTIUM_M) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_M_FAMILY &&
@ -379,8 +398,9 @@ int CConfigureDlg::GetCpuTypeIndex(){
np2cfg.cpu_stepping == CPU_PENTIUM_M_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_M &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_M &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_M){
return 8;
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_M &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_M){
return 9;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_4) != CPU_FEATURES_PENTIUM_4) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_4_FAMILY &&
@ -388,8 +408,9 @@ int CConfigureDlg::GetCpuTypeIndex(){
np2cfg.cpu_stepping == CPU_PENTIUM_4_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_4 &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_4 &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_4){
return 9;
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_4 &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_4){
return 10;
}
AMDCPUCheck:
@ -400,7 +421,8 @@ AMDCPUCheck:
np2cfg.cpu_stepping == CPU_AMD_K6_2_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K6_2 &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K6_2 &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K6_2){
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K6_2 &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K6_2){
return 15;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_AMD_K6_III) != CPU_FEATURES_AMD_K6_III ||
@ -410,7 +432,8 @@ AMDCPUCheck:
np2cfg.cpu_stepping == CPU_AMD_K6_III_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K6_III &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K6_III &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K6_III){
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K6_III &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K6_III){
return 16;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_AMD_K7_ATHLON) != CPU_FEATURES_AMD_K7_ATHLON ||
@ -420,7 +443,8 @@ AMDCPUCheck:
np2cfg.cpu_stepping == CPU_AMD_K7_ATHLON_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K7_ATHLON &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K7_ATHLON &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K7_ATHLON){
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K7_ATHLON &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K7_ATHLON){
return 17;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_AMD_K7_ATHLON_XP) != CPU_FEATURES_AMD_K7_ATHLON_XP ||
@ -430,7 +454,8 @@ AMDCPUCheck:
np2cfg.cpu_stepping == CPU_AMD_K7_ATHLON_XP_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K7_ATHLON_XP &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K7_ATHLON_XP &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K7_ATHLON_XP){
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K7_ATHLON_XP &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K7_ATHLON_XP){
return 18;
}
@ -450,100 +475,121 @@ int CConfigureDlg::SetCpuTypeIndex(UINT index){
#if defined(CPUCORE_IA32)
switch(index){
case 1:
np2cfg.cpu_family = CPU_80386_FAMILY;
np2cfg.cpu_model = CPU_80386_MODEL;
np2cfg.cpu_stepping = CPU_80386_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_80386;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_80386;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_80386;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_80386;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_80386);
np2cfg.cpu_brandid = CPU_BRAND_ID_80386;
break;
case 2:
np2cfg.cpu_family = CPU_I486SX_FAMILY;
np2cfg.cpu_model = CPU_I486SX_MODEL;
np2cfg.cpu_stepping = CPU_I486SX_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_I486SX;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_I486SX;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_I486SX;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_I486SX;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_I486SX);
np2cfg.cpu_brandid = CPU_BRAND_ID_I486SX;
break;
case 2:
case 3:
np2cfg.cpu_family = CPU_I486DX_FAMILY;
np2cfg.cpu_model = CPU_I486DX_MODEL;
np2cfg.cpu_stepping = CPU_I486DX_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_I486DX;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_I486DX;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_I486DX;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_I486DX;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_I486DX);
np2cfg.cpu_brandid = CPU_BRAND_ID_I486DX;
break;
case 3:
case 4:
np2cfg.cpu_family = CPU_PENTIUM_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM;
break;
case 4:
case 5:
np2cfg.cpu_family = CPU_MMX_PENTIUM_FAMILY;
np2cfg.cpu_model = CPU_MMX_PENTIUM_MODEL;
np2cfg.cpu_stepping = CPU_MMX_PENTIUM_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_MMX_PENTIUM;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_MMX_PENTIUM;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_MMX_PENTIUM;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_MMX_PENTIUM;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_MMX_PENTIUM);
np2cfg.cpu_brandid = CPU_BRAND_ID_MMX_PENTIUM;
break;
case 5:
case 6:
np2cfg.cpu_family = CPU_PENTIUM_PRO_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_PRO_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_PRO_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_PRO;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_PRO;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_PRO;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_PRO;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_PRO);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_PRO;
break;
case 6:
case 7:
np2cfg.cpu_family = CPU_PENTIUM_II_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_II_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_II_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_II;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_II;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_II;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_II;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_II);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_II;
break;
case 7:
case 8:
np2cfg.cpu_family = CPU_PENTIUM_III_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_III_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_III_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_III;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_III;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_III;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_III;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_III);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_III;
break;
case 8:
case 9:
np2cfg.cpu_family = CPU_PENTIUM_M_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_M_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_M_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_M;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_M;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_M;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_M;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_M);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_M;
break;
case 9:
case 10:
np2cfg.cpu_family = CPU_PENTIUM_4_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_4_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_4_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_4;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_4;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_4;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_4;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_4);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_4;
@ -555,6 +601,7 @@ int CConfigureDlg::SetCpuTypeIndex(UINT index){
np2cfg.cpu_feature = CPU_FEATURES_AMD_K6_2;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K6_2;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K6_2;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K6_2;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K6_2);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K6_2;
@ -566,6 +613,7 @@ int CConfigureDlg::SetCpuTypeIndex(UINT index){
np2cfg.cpu_feature = CPU_FEATURES_AMD_K6_III;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K6_III;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K6_III;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K6_III;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K6_III);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K6_III;
@ -577,6 +625,7 @@ int CConfigureDlg::SetCpuTypeIndex(UINT index){
np2cfg.cpu_feature = CPU_FEATURES_AMD_K7_ATHLON;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K7_ATHLON;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K7_ATHLON;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K7_ATHLON;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K7_ATHLON);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K7_ATHLON;
@ -588,17 +637,19 @@ int CConfigureDlg::SetCpuTypeIndex(UINT index){
np2cfg.cpu_feature = CPU_FEATURES_AMD_K7_ATHLON_XP;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K7_ATHLON_XP;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K7_ATHLON_XP;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K7_ATHLON_XP;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K7_ATHLON_XP);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K7_ATHLON_XP;
break;
case 255: // 全機能使用可能
case 255: // 全機能使用可能
np2cfg.cpu_family = 0;
np2cfg.cpu_model = 0;
np2cfg.cpu_stepping = 0;
np2cfg.cpu_feature = 0;
np2cfg.cpu_feature_ecx = 0;
np2cfg.cpu_feature_ex = 0;
np2cfg.cpu_eflags_mask = 0;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_NEKOPRO);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_NEKOPRO);
np2cfg.cpu_brandid = 0;
@ -620,7 +671,7 @@ int CConfigureDlg::SetCpuTypeIndex(UINT index){
}
/**
* OK (IDOK ID )
* OK (IDOK ID )
*/
void CConfigureDlg::OnOK()
{
@ -754,10 +805,10 @@ void CConfigureDlg::OnOK()
}
/**
*
* @param[in] wParam
* @param[in] lParam
* @retval TRUE
*
* @param[in] wParam
* @param[in] lParam
* @retval TRUE
*/
BOOL CConfigureDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
@ -794,8 +845,8 @@ BOOL CConfigureDlg::OnCommand(WPARAM wParam, LPARAM lParam)
}
/**
*
* @param[in] nMultiple
*
* @param[in] nMultiple
*/
void CConfigureDlg::SetClock(UINT nMultiple)
{
@ -815,8 +866,8 @@ void CConfigureDlg::SetClock(UINT nMultiple)
}
/**
*
* @param[in] hwndParent
*
* @param[in] hwndParent
*/
void dialog_configure(HWND hwndParent)
{

142
win9x/dialog/d_serial.cpp Executable file → Normal file
View File

@ -33,7 +33,7 @@ extern COMMNG cm_pc9861ch2;
#endif
/**
* @brief COM
* @brief COM
*/
class SerialOptComPage : public CPropPageProc
{
@ -47,9 +47,9 @@ protected:
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
private:
COMMNG m_cm; //!< パラメタ
COMCFG& m_cfg; //!< コンフィグ
UINT8 m_pentabfa; //!< ペンタブアスペクト比固定
COMMNG m_cm; //!< パラメタ
COMCFG& m_cfg; //!< コンフィグ
UINT8 m_pentabfa; //!< ペンタブアスペクト比固定
CWndProc m_chkpentabfa; //!< Pen tablet fixed aspect mode
CWndProc m_chkfixedspeed; //!< Fixed speed mode
CComboData m_port; //!< Port
@ -65,7 +65,7 @@ private:
void UpdateControls();
};
//! ポート
//! ポート
static const CComboData::Entry s_port[] =
{
{MAKEINTRESOURCE(IDS_NONCONNECT), COMPORT_NONE},
@ -82,7 +82,7 @@ static const CComboData::Entry s_port[] =
#endif
};
//! キャラクタ サイズ
//! キャラクタ サイズ
static const CComboData::Value s_chars[] =
{
{5, 0x00},
@ -91,7 +91,7 @@ static const CComboData::Value s_chars[] =
{8, 0x0c},
};
//! パリティ
//! パリティ
static const CComboData::Entry s_parity[] =
{
{MAKEINTRESOURCE(IDS_PARITY_NONE), 0x00},
@ -99,7 +99,7 @@ static const CComboData::Entry s_parity[] =
{MAKEINTRESOURCE(IDS_PARITY_EVEN), 0x30},
};
//! ストップ ビット
//! ストップ ビット
static const CComboData::Entry s_sbit[] =
{
{MAKEINTRESOURCE(IDS_1), 0x40},
@ -108,10 +108,10 @@ static const CComboData::Entry s_sbit[] =
};
/**
*
* @param[in] nCaption ID
* @param[in] cm
* @param[in] cfg
*
* @param[in] nCaption ID
* @param[in] cm
* @param[in] cfg
*/
SerialOptComPage::SerialOptComPage(UINT nCaption, COMMNG cm, COMCFG& cfg)
: CPropPageProc(IDD_SERIAL1, nCaption)
@ -121,16 +121,16 @@ SerialOptComPage::SerialOptComPage(UINT nCaption, COMMNG cm, COMCFG& cfg)
}
/**
*
*
*/
SerialOptComPage::~SerialOptComPage()
{
}
/**
* WM_INITDIALOG
* @retval TRUE
* @retval FALSE
* WM_INITDIALOG
* @retval TRUE
* @retval FALSE
*/
BOOL SerialOptComPage::OnInitDialog()
{
@ -191,6 +191,11 @@ BOOL SerialOptComPage::OnInitDialog()
m_pipename.SetWindowText(m_cfg.pipename);
m_pipeserv.SubclassDlgItem(IDC_COM1PIPESERV, this);
m_pipeserv.SetWindowText(m_cfg.pipeserv);
{
TCHAR pipecmd[MAX_PATH*3];
_stprintf(pipecmd, _T("\\\\%s\\pipe\\%s"), m_cfg.pipeserv, m_cfg.pipename);
SetDlgItemText(IDC_COM1STR32, pipecmd);
}
#endif
UpdateControls();
@ -200,7 +205,7 @@ BOOL SerialOptComPage::OnInitDialog()
}
/**
* OK (IDOK ID )
* OK (IDOK ID )
*/
void SerialOptComPage::OnOK()
{
@ -305,10 +310,10 @@ void SerialOptComPage::OnOK()
}
/**
*
* @param[in] wParam
* @param[in] lParam
* @retval TRUE
*
* @param[in] wParam
* @param[in] lParam
* @retval TRUE
*/
BOOL SerialOptComPage::OnCommand(WPARAM wParam, LPARAM lParam)
{
@ -325,12 +330,27 @@ BOOL SerialOptComPage::OnCommand(WPARAM wParam, LPARAM lParam)
case IDC_COM1PENTABFA:
m_pentabfa = (m_chkpentabfa.SendMessage(BM_GETCHECK , 0 , 0) ? 1 : 0);
return TRUE;
#if defined(SUPPORT_NAMED_PIPE)
case IDC_COM1PIPENAME:
case IDC_COM1PIPESERV:
{
TCHAR pipename[MAX_PATH];
TCHAR pipeserv[MAX_PATH];
TCHAR pipecmd[MAX_PATH*3];
GetDlgItemText(IDC_COM1PIPENAME, pipename, _countof(pipename));
GetDlgItemText(IDC_COM1PIPESERV, pipeserv, _countof(pipeserv));
_stprintf(pipecmd, _T("\\\\%s\\pipe\\%s"), pipeserv, pipename);
SetDlgItemText(IDC_COM1STR32, pipecmd);
return TRUE;
}
#endif
}
return FALSE;
}
/**
*
*
*/
void SerialOptComPage::UpdateControls()
{
@ -389,7 +409,7 @@ void SerialOptComPage::UpdateControls()
static const UINT pipe[] =
{
IDC_COM1PIPENAME, IDC_COM1PIPESERV,
IDC_COM1STR30, IDC_COM1STR31
IDC_COM1STR30, IDC_COM1STR31, IDC_COM1STR32
};
for (UINT i = 0; i < _countof(pipe); i++)
{
@ -404,7 +424,7 @@ void SerialOptComPage::UpdateControls()
// ----
/**
* @brief 61
* @brief 61
*/
class SerialOpt61Page : public CPropPageProc
{
@ -419,8 +439,8 @@ protected:
virtual LRESULT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);
private:
UINT8 m_sw[3]; //!< スイッチ
UINT8 m_jmp[6]; //!< ジャンパ
UINT8 m_sw[3]; //!< スイッチ
UINT8 m_jmp[6]; //!< ジャンパ
CComboData m_speed[2]; //!< Speed
CComboData m_int[2]; //!< INT
CComboData m_sync[2]; //!< Mode
@ -467,7 +487,7 @@ static const CComboData::Value s_int2[] =
{6, 0x0c},
};
//! 同期方法
//! 同期方法
static const CComboData::Entry s_sync[] =
{
{MAKEINTRESOURCE(IDS_SYNC), 0x03},
@ -477,7 +497,7 @@ static const CComboData::Entry s_sync[] =
};
/**
*
*
*/
SerialOpt61Page::SerialOpt61Page()
: CPropPageProc(IDD_PC9861A)
@ -487,16 +507,16 @@ SerialOpt61Page::SerialOpt61Page()
}
/**
*
*
*/
SerialOpt61Page::~SerialOpt61Page()
{
}
/**
* WM_INITDIALOG
* @retval TRUE
* @retval FALSE
* WM_INITDIALOG
* @retval TRUE
* @retval FALSE
*/
BOOL SerialOpt61Page::OnInitDialog()
{
@ -525,7 +545,7 @@ BOOL SerialOpt61Page::OnInitDialog()
}
/**
* OK (IDOK ID )
* OK (IDOK ID )
*/
void SerialOpt61Page::OnOK()
{
@ -556,10 +576,10 @@ void SerialOpt61Page::OnOK()
}
/**
*
* @param[in] wParam
* @param[in] lParam
* @retval TRUE
*
* @param[in] wParam
* @param[in] lParam
* @retval TRUE
*/
BOOL SerialOpt61Page::OnCommand(WPARAM wParam, LPARAM lParam)
{
@ -597,11 +617,11 @@ BOOL SerialOpt61Page::OnCommand(WPARAM wParam, LPARAM lParam)
}
/**
* CWndProc Windows (WindowProc)
* @param[in] nMsg Windows
* @param[in] wParam 使
* @param[in] lParam 使
* @return
* CWndProc Windows (WindowProc)
* @param[in] nMsg Windows
* @param[in] wParam 使
* @param[in] lParam 使
* @return
*/
LRESULT SerialOpt61Page::WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
{
@ -620,9 +640,9 @@ LRESULT SerialOpt61Page::WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
}
/**
*
* @param[in] sw
* @param[in] jmp
*
* @param[in] sw
* @param[in] jmp
*/
void SerialOpt61Page::Set(const UINT8* sw, const UINT8* jmp)
{
@ -636,10 +656,10 @@ void SerialOpt61Page::Set(const UINT8* sw, const UINT8* jmp)
}
/**
*
* @param[in] nIndex
* @param[in] cMode
* @return
*
* @param[in] nIndex
* @param[in] cMode
* @return
*/
UINT8 SerialOpt61Page::GetMode(UINT nIndex, UINT8 cMode)
{
@ -665,9 +685,9 @@ UINT8 SerialOpt61Page::GetMode(UINT nIndex, UINT8 cMode)
}
/**
*
* @param[in] nIndex
* @param[in] cMode
*
* @param[in] nIndex
* @param[in] cMode
*/
void SerialOpt61Page::SetMode(UINT nIndex, UINT8 cMode)
{
@ -692,9 +712,9 @@ void SerialOpt61Page::SetMode(UINT nIndex, UINT8 cMode)
}
/**
*
* @param[in] nIndex
* @param[out] cMode
*
* @param[in] nIndex
* @param[out] cMode
*/
void SerialOpt61Page::UpdateMode(UINT nIndex, UINT8& cMode)
{
@ -708,7 +728,7 @@ void SerialOpt61Page::UpdateMode(UINT nIndex, UINT8& cMode)
}
/**
* DIPSW
* DIPSW
*/
void SerialOpt61Page::OnDipSw()
{
@ -730,7 +750,7 @@ void SerialOpt61Page::OnDipSw()
CopyMemory(sw, m_sw, sizeof(sw));
CopyMemory(jmp, m_jmp, sizeof(jmp));
if ((p.y >= 1) && (p.y < 3)) // 1段目
if ((p.y >= 1) && (p.y < 3)) // 1段目
{
if ((p.x >= 1) && (p.x < 7)) // S1
{
@ -745,7 +765,7 @@ void SerialOpt61Page::OnDipSw()
sw[2] ^= (1 << (p.x - 17));
}
}
else if ((p.y >= 4) && (p.y < 6)) // 2段目
else if ((p.y >= 4) && (p.y < 6)) // 2段目
{
if ((p.x >= 1) && (p.x < 7)) // J1
{
@ -760,7 +780,7 @@ void SerialOpt61Page::OnDipSw()
jmp[2] = (1 << (p.x - 17));
}
}
else if ((p.y >= 7) && (p.y < 9)) // 3段目
else if ((p.y >= 7) && (p.y < 9)) // 3段目
{
if ((p.x >= 1) && (p.x < 9)) // J4
{
@ -789,8 +809,8 @@ void SerialOpt61Page::OnDipSw()
// ----
/**
*
* @param[in] hwndParent
*
* @param[in] hwndParent
*/
void dialog_serial(HWND hwndParent)
{

View File

@ -554,6 +554,7 @@ static const PFTBL s_IniItems[] =
PFVAL("optsb16p", PFTYPE_HEX8, &np2cfg.sndsb16io),
PFVAL("optsb16d", PFTYPE_UINT8, &np2cfg.sndsb16dma),
PFVAL("optsb16i", PFTYPE_UINT8, &np2cfg.sndsb16irq),
PFVAL("optsb16A", PFTYPE_BOOL, &np2cfg.sndsb16at),
#endif /* SUPPORT_SOUND_SB16 */
PFMAX("volume_M", PFTYPE_UINT8, &np2cfg.vol_master, 100),
@ -663,6 +664,7 @@ static const PFTBL s_IniItems[] =
PFSTR("cpu_bran", PFRO_STR, np2cfg.cpu_brandstring_o),
PFVAL("cpu_brid", PFTYPE_HEX32, &np2cfg.cpu_brandid),
PFVAL("cpu_fecx", PFTYPE_HEX32, &np2cfg.cpu_feature_ecx),
PFVAL("cpu_eflg", PFTYPE_HEX32, &np2cfg.cpu_eflags_mask),
PFMAX("FPU_TYPE", PFTYPE_UINT8, &np2cfg.fpu_type, 0), // FPU種類
@ -682,6 +684,9 @@ static const PFTBL s_IniItems[] =
#if defined(SUPPORT_IDEIO)
PFVAL("IDEBADDR", PFRO_HEX8, &np2cfg.idebaddr), // IDE BIOS アドレスデフォルトD8h(D8000h)
#endif
#if defined(SUPPORT_GAMEPORT)
PFVAL("GAMEPORT", PFTYPE_BOOL, &np2cfg.gameport),
#endif

22
win9x/joymng.cpp Executable file → Normal file
View File

@ -51,36 +51,38 @@ void joymng_sync(void) {
REG8 joymng_getstat(void) {
JOYINFO ji;
JOYINFOEX ji;
static DWORD nojoy_time = 0;
if (np2oscfg.JOYPAD1 == 1){
if(nojoy_time == 0 || GetTickCount() - nojoy_time > 5000){
if(joyGetPos(JOYSTICKID1, &ji) == JOYERR_NOERROR) {
ji.dwSize = sizeof(JOYINFOEX);
ji.dwFlags = JOY_RETURNALL;
if(joyGetPosEx(JOYSTICKID1, &ji) == JOYERR_NOERROR) {
np2oscfg.JOYPAD1 |= 0x80;
joyflag = 0xff;
if (ji.wXpos < 0x4000U) {
if (ji.dwXpos < 0x4000U) {
joyflag &= ~JOY_LEFT_BIT;
}
else if (ji.wXpos > 0xc000U) {
else if (ji.dwXpos > 0xc000U) {
joyflag &= ~JOY_RIGHT_BIT;
}
if (ji.wYpos < 0x4000U) {
if (ji.dwYpos < 0x4000U) {
joyflag &= ~JOY_UP_BIT;
}
else if (ji.wYpos > 0xc000U) {
else if (ji.dwYpos > 0xc000U) {
joyflag &= ~JOY_DOWN_BIT;
}
if (ji.wButtons & JOY_BUTTON1) {
if (ji.dwButtons & JOY_BUTTON1) {
joyflag &= joypad1btn[0]; // ver0.28
}
if (ji.wButtons & JOY_BUTTON2) {
if (ji.dwButtons & JOY_BUTTON2) {
joyflag &= joypad1btn[1]; // ver0.28
}
if (ji.wButtons & JOY_BUTTON3) {
if (ji.dwButtons & JOY_BUTTON3) {
joyflag &= joypad1btn[2]; // ver0.28
}
if (ji.wButtons & JOY_BUTTON4) {
if (ji.dwButtons & JOY_BUTTON4) {
joyflag &= joypad1btn[3]; // ver0.28
}
nojoy_time = 0;

View File

@ -382,6 +382,11 @@ void xmenu_update(HMENU hMenu)
CheckMenuItem(hMenu, IDM_SPARKBOARD, MF_BYCOMMAND | MFCHECK(SOUND_SW == 0x40));
#if defined(SUPPORT_SOUND_SB16)
CheckMenuItem(hMenu, IDM_SB16, MF_BYCOMMAND | MFCHECK(SOUND_SW == SOUNDID_SB16));
CheckMenuItem(hMenu, IDM_PC9801_86_SB16, MF_BYCOMMAND | MFCHECK(SOUND_SW == SOUNDID_PC_9801_86_SB16));
CheckMenuItem(hMenu, IDM_WSS_SB16, MF_BYCOMMAND | MFCHECK(SOUND_SW == SOUNDID_WSS_SB16));
CheckMenuItem(hMenu, IDM_PC9801_86_WSS_SB16, MF_BYCOMMAND | MFCHECK(SOUND_SW == SOUNDID_PC_9801_86_WSS_SB16));
CheckMenuItem(hMenu, IDM_PC9801_118_SB16, MF_BYCOMMAND | MFCHECK(SOUND_SW == SOUNDID_PC_9801_118_SB16));
CheckMenuItem(hMenu, IDM_PC9801_86_118_SB16, MF_BYCOMMAND | MFCHECK(SOUND_SW == SOUNDID_PC_9801_86_118_SB16));
#endif // defined(SUPPORT_SOUND_SB16)
#if defined(SUPPORT_PX)
CheckMenuItem(hMenu, IDM_PX1, MF_BYCOMMAND | MFCHECK(SOUND_SW == 0x30));

View File

@ -1342,6 +1342,31 @@ static void OnCommand(HWND hWnd, WPARAM wParam)
np2cfg.SOUND_SW = SOUNDID_SB16;
update |= SYS_UPDATECFG | SYS_UPDATESBOARD;
break;
case IDM_PC9801_86_SB16:
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_SB16;
update |= SYS_UPDATECFG | SYS_UPDATESBOARD;
break;
case IDM_WSS_SB16:
np2cfg.SOUND_SW = SOUNDID_WSS_SB16;
update |= SYS_UPDATECFG | SYS_UPDATESBOARD;
break;
case IDM_PC9801_86_WSS_SB16:
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_WSS_SB16;
update |= SYS_UPDATECFG | SYS_UPDATESBOARD;
break;
case IDM_PC9801_118_SB16:
np2cfg.SOUND_SW = SOUNDID_PC_9801_118_SB16;
update |= SYS_UPDATECFG | SYS_UPDATESBOARD;
break;
case IDM_PC9801_86_118_SB16:
np2cfg.SOUND_SW = SOUNDID_PC_9801_86_118_SB16;
update |= SYS_UPDATECFG | SYS_UPDATESBOARD;
break;
#endif // defined(SUPPORT_SOUND_SB16)
#if defined(SUPPORT_PX)

View File

@ -138,7 +138,7 @@
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>NP2_WIN;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_NET;SUPPORT_LARGE_MEMORY;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_GPIB;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;TRACE;SUPPORT_NP2_THREAD;NP2_THREAD_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>NP2_WIN;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_NET;SUPPORT_LARGE_MEMORY;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_GAMEPORT;SUPPORT_GPIB;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;TRACE;SUPPORT_NP2_THREAD;NP2_THREAD_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\;.\x86;..\;..\common;..\fdd;..\i386c;..\mem;..\io;..\io\pci;..\cbus;..\network;..\vram;..\sound;..\wab;..\generic;\VST_SDK</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4819</DisableSpecificWarnings>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
@ -164,7 +164,7 @@
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>NP2_WIN;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_NET;SUPPORT_LARGE_MEMORY;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_GPIB;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;TRACE;SUPPORT_NP2_THREAD;NP2_THREAD_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>NP2_WIN;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_NET;SUPPORT_LARGE_MEMORY;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_GPIB;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_GAMEPORT;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;TRACE;SUPPORT_NP2_THREAD;NP2_THREAD_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\;.\x64;..\;..\common;..\fdd;..\i386c;..\mem;..\io;..\io\pci;..\cbus;..\network;..\vram;..\sound;..\wab;..\generic;\VST_SDK</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4819</DisableSpecificWarnings>
<AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions>
@ -194,7 +194,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NP2_WIN;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_NET;SUPPORT_LARGE_MEMORY;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_GPIB;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;SUPPORT_NP2_THREAD;NP2_THREAD_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>NP2_WIN;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_NET;SUPPORT_LARGE_MEMORY;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_GPIB;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_GAMEPORT;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;SUPPORT_NP2_THREAD;NP2_THREAD_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\;.\x86;..\;..\common;..\fdd;..\i386c;..\mem;..\io;..\io\pci;..\cbus;..\network;..\vram;..\sound;..\wab;..\generic;\VST_SDK</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4819</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
@ -228,7 +228,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NP2_WIN;WIN32;NDEBUG;_CRTDBG_MAP_ALLOC;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_NET;SUPPORT_LARGE_MEMORY;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_GPIB;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;SUPPORT_NP2_THREAD;NP2_THREAD_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>NP2_WIN;WIN32;NDEBUG;_CRTDBG_MAP_ALLOC;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_NET;SUPPORT_LARGE_MEMORY;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_GPIB;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_GAMEPORT;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;SUPPORT_NP2_THREAD;NP2_THREAD_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\;.\x64;..\;..\common;..\fdd;..\i386c;..\mem;..\io;..\io\pci;..\cbus;..\network;..\vram;..\sound;..\wab;..\generic;\VST_SDK</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4819</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
@ -269,7 +269,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_LARGE_MEMORY;SUPPORT_NET;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_PHYSICAL_CDDRV;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_IA32_HAXM;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_LARGE_MEMORY;SUPPORT_NET;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_PHYSICAL_CDDRV;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_GAMEPORT;SUPPORT_IA32_HAXM;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\;.\x86;..\;..\common;..\i386c;..\mem;..\io;..\cbus;..\vram;..\sound;..\generic;</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4819</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
@ -293,7 +293,7 @@
<AdditionalOptions>-I.\x86\ -I..\i386c\x86\ -I..\io\x86\ %(AdditionalOptions)</AdditionalOptions>
</NASM>
<ResourceCompile>
<PreprocessorDefinitions>_UNICODE;UNICODE;SUPPORT_PC9821;NP2_WIN;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_LARGE_MEMORY;SUPPORT_NET;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_PHYSICAL_CDDRV;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_IA32_HAXM;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_UNICODE;UNICODE;SUPPORT_PC9821;NP2_WIN;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_LARGE_MEMORY;SUPPORT_NET;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_PHYSICAL_CDDRV;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_GAMEPORT;SUPPORT_IA32_HAXM;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseHAXM|x64'">
@ -303,7 +303,7 @@
</PrecompiledHeader>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CRTDBG_MAP_ALLOC;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_LARGE_MEMORY;SUPPORT_NET;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_PHYSICAL_CDDRV;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_IA32_HAXM;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CRTDBG_MAP_ALLOC;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NP2_WIN;SUPPORT_PC9821;SUPPORT_IDEIO;SUPPORT_LARGE_HDD;SUPPORT_LARGE_MEMORY;SUPPORT_NET;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_PHYSICAL_CDDRV;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_GAMEPORT;SUPPORT_IA32_HAXM;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\;.\x64;..\;..\common;..\i386c;..\mem;..\io;..\cbus;..\vram;..\sound;..\generic;</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4819</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
@ -331,7 +331,7 @@
<AdditionalOptions>-I.\x64\ -I..\i386c\x64\ -I..\io\x64\ %(AdditionalOptions)</AdditionalOptions>
</YASM>
<ResourceCompile>
<PreprocessorDefinitions>_WIN64;_UNICODE;UNICODE;SUPPORT_PC9821;SUPPORT_IDEIO;NP2_WIN;SUPPORT_LARGE_HDD;SUPPORT_LARGE_MEMORY;SUPPORT_NET;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_PHYSICAL_CDDRV;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_IA32_HAXM;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_WIN64;_UNICODE;UNICODE;SUPPORT_PC9821;SUPPORT_IDEIO;NP2_WIN;SUPPORT_LARGE_HDD;SUPPORT_LARGE_MEMORY;SUPPORT_NET;SUPPORT_LGY98;SUPPORT_WAB;SUPPORT_CL_GD5430;SUPPORT_HRTIMER;SUPPORT_VPCVHD;SUPPORT_KAI_IMAGES;SUPPORT_NVL_IMAGES;SUPPORT_PHYSICAL_CDDRV;SUPPORT_FMGEN;SUPPORT_SOUND_SB16;SUPPORT_FPU_DOSBOX;SUPPORT_FPU_DOSBOX2;SUPPORT_FPU_SOFTFLOAT;SUPPORT_GPIB;SUPPORT_PCI;SUPPORT_SCRN_DIRECT3D;SUPPORT_FAST_MEMORYCHECK;SUPPORT_PEGC;SUPPORT_ASYNC_CPU;SUPPORT_SMPU98;SUPPORT_WACOM_TABLET;SUPPORT_RS232C_FIFO;SUPPORT_NAMED_PIPE;SUPPORT_VGA_MODEX;SUPPORT_GAMEPORT;SUPPORT_IA32_HAXM;HOOK_SYSKEY;ALLOW_MULTIRUN;USE_FPU;USE_MMX;USE_3DNOW;USE_SSE;USE_SSE2;USE_SSE3;USE_TSC;USE_MAME;USE_FASTPAGING;USE_VME;BIOS_IO_EMULATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Manifest>
<EnableDPIAwareness>true</EnableDPIAwareness>

View File

@ -83,7 +83,7 @@ void Np2Arg::Parse()
}
}
}
if(m_lpIniFile){ // np21w ver0.86 rev8
if(lpIniFile){ // np21w ver0.86 rev8
LPTSTR strbuf;
strbuf = (LPTSTR)calloc(500, sizeof(TCHAR));
if(!(_tcsstr(lpIniFile,_T(":"))!=NULL || (lpIniFile[0]=='¥¥'))){

View File

@ -164,6 +164,7 @@
#define IDC_COM1STR31 14125
#define IDC_COM1PIPENAME 14126
#define IDC_COM1PIPESERV 14127
#define IDC_COM1STR32 14128
#define IDC_PC9861E 14201
#define IDC_CH1SPEED 14202
#define IDC_CH1INT 14203
@ -534,6 +535,7 @@
#define IDS_CPU_AMD_K7_ATHLON 32037
#define IDS_CPU_AMD_K7_ATHLONXP 32038
#define IDS_CPU_80286 32040
#define IDS_CPU_80386 32041
#define IDS_CPU_NEKOPRO 32049
#define IDS_RENDERER_DIRECTDRAW 32100
#define IDS_RENDERER_DIRECT3D 32101
@ -704,6 +706,11 @@
#define IDM_PC9801_86_118 49650
#define IDM_86SPEAKBOARD 49651
#define IDM_WAVESTAR 49652
#define IDM_PC9801_118_SB16 49655
#define IDM_PC9801_86_118_SB16 49656
#define IDM_PC9801_86_WSS_SB16 49657
#define IDM_WSS_SB16 49658
#define IDM_PC9801_86_SB16 49659
#define IDM_MEM640 40661
#define IDM_MEM16 40662
#define IDM_MEM36 40663

View File

@ -1066,6 +1066,11 @@ BEGIN
MENUITEM "Sound &Orchestra", IDM_SOUNDORCHESTRA
MENUITEM "Sound Orchestra-&V", IDM_SOUNDORCHESTRAV
MENUITEM "Sound &Blaster 16", IDM_SB16
MENUITEM "PC-9801-86 + Sound Blaster 16", IDM_PC9801_86_SB16
MENUITEM "Mate-X PCM + Sound Blaster 16", IDM_WSS_SB16
MENUITEM "PC-9801-118 + Sound Blaster 16", IDM_PC9801_118_SB16
MENUITEM "PC-9801-86 + Mate-X PCM(B460) + Sound Blaster 16", IDM_PC9801_86_WSS_SB16
MENUITEM "PC-9801-86 + 118(B460) + Sound Blaster 16", IDM_PC9801_86_118_SB16
MENUITEM "&AMD-98", IDM_AMD98
MENUITEM "&WaveStar", IDM_WAVESTAR
MENUITEM "&JastSound", IDM_JASTSOUND

View File

@ -25,8 +25,8 @@ IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..\\np2.mnf"
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,8,6,69
PRODUCTVERSION 0,8,6,69
FILEVERSION 0,8,6,71
PRODUCTVERSION 0,8,6,71
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -42,10 +42,10 @@ BEGIN
BLOCK "040904e4"
BEGIN
VALUE "CompanyName", "\0"
VALUE "FileVersion", "0, 8, 6, 69\0"
VALUE "FileVersion", "0, 8, 6, 71\0"
VALUE "LegalCopyright", "Nekosan development team\0"
VALUE "ProductVersion", "0, 8, 6, 69\0"
VALUE "ProductVersion", "0, 8, 6, 71\0"
#ifdef _USRDLL
VALUE "FileDescription", "PC-98x1series emulator resource file\0"
VALUE "ProductName", "Neko Project II resource file\0"

View File

@ -258,6 +258,7 @@ BEGIN
EDITTEXT IDC_COM1PIPENAME,55,25,80,14, ES_AUTOHSCROLL
LTEXT "Server Name",IDC_COM1STR31,8,44,50,8
EDITTEXT IDC_COM1PIPESERV,55,41,80,14, ES_AUTOHSCROLL
EDITTEXT IDC_COM1STR32,8,60,150,14, ES_READONLY
END
IDD_PC9861A DIALOG 0, 0, 224, 140
@ -1062,6 +1063,11 @@ BEGIN
MENUITEM "Sound &Orchestra", IDM_SOUNDORCHESTRA
MENUITEM "Sound Orchestra-&V", IDM_SOUNDORCHESTRAV
MENUITEM "Sound B&laster 16", IDM_SB16
MENUITEM "PC-9801-86 + Sound Blaster 16", IDM_PC9801_86_SB16
MENUITEM "Mate-X PCM + Sound Blaster 16", IDM_WSS_SB16
MENUITEM "PC-9801-118 + Sound Blaster 16", IDM_PC9801_118_SB16
MENUITEM "PC-9801-86 + Mate-X PCM(B460) + Sound Blaster 16", IDM_PC9801_86_WSS_SB16
MENUITEM "PC-9801-86 + 118(B460) + Sound Blaster 16", IDM_PC9801_86_118_SB16
MENUITEM "&AMD-98", IDM_AMD98
MENUITEM "&WaveStar", IDM_WAVESTAR
MENUITEM "&JastSound", IDM_JASTSOUND
@ -1711,6 +1717,7 @@ STRINGTABLE
BEGIN
IDS_CPU_CUSTOM "(custom)"
IDS_CPU_80286 "Intel 80286"
IDS_CPU_80386 "Intel 80386"
IDS_CPU_I486SX "Intel i486SX"
IDS_CPU_I486DX "Intel i486DX"
IDS_CPU_PENTIUM "Intel Pentium"

View File

@ -25,8 +25,8 @@ IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..\\np2.mnf"
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,8,6,69
PRODUCTVERSION 0,8,6,69
FILEVERSION 0,8,6,71
PRODUCTVERSION 0,8,6,71
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -42,10 +42,10 @@ BEGIN
BLOCK "041103a4"
BEGIN
VALUE "CompanyName", "\0"
VALUE "FileVersion", "0, 8, 6, 69\0"
VALUE "FileVersion", "0, 8, 6, 71\0"
VALUE "LegalCopyright", "ねこさん開発ちーむ\0"
VALUE "ProductVersion", "0, 8, 6, 69\0"
VALUE "ProductVersion", "0, 8, 6, 71\0"
#ifdef _USRDLL
VALUE "FileDescription", "PC-98x1series emulator resource file\0"
VALUE "ProductName", "Neko Project II resource file\0"

View File

@ -1059,6 +1059,11 @@ BEGIN
MENUITEM "Sound &Orchestra", IDM_SOUNDORCHESTRA
MENUITEM "Sound Orchestra-&V", IDM_SOUNDORCHESTRAV
MENUITEM "Sound &Blaster 16", IDM_SB16
MENUITEM "PC-9801-86 + Sound Blaster 16", IDM_PC9801_86_SB16
MENUITEM "Mate-X PCM + Sound Blaster 16", IDM_WSS_SB16
MENUITEM "PC-9801-118 + Sound Blaster 16", IDM_PC9801_118_SB16
MENUITEM "PC-9801-86 + Mate-X PCM(B460) + Sound Blaster 16", IDM_PC9801_86_WSS_SB16
MENUITEM "PC-9801-86 + 118(B460) + Sound Blaster 16", IDM_PC9801_86_118_SB16
MENUITEM "&AMD-98", IDM_AMD98
MENUITEM "&WaveStar", IDM_WAVESTAR
MENUITEM "&JastSound", IDM_JASTSOUND

View File

@ -45,6 +45,8 @@ struct _commng {
UINT connect;
UINT (*read)(COMMNG self, UINT8 *data);
UINT (*write)(COMMNG self, UINT8 data);
UINT (*writeretry)(COMMNG self);
UINT (*lastwritesuccess)(COMMNG self);
UINT8 (*getstat)(COMMNG self);
INTPTR (*msg)(COMMNG self, UINT msg, INTPTR param);
void (*release)(COMMNG self);

View File

@ -46,7 +46,7 @@ static const char *clockmult_str[] = {
};
static const char *cputype_str[] = {
"(custom)", "Intel i486SX", "Intel i486DX", "Intel Pentium", "Intel MMX Pentium", "Intel Pentium Pro", "Intel Pentium II", "Intel Pentium III", "AMD K6-2", "AMD K6-III", "AMD K7 Athlon", "AMD K7 Athlon XP", "Neko Processor II"
"(custom)", "Intel 80386", "Intel i486SX", "Intel i486DX", "Intel Pentium", "Intel MMX Pentium", "Intel Pentium Pro", "Intel Pentium II", "Intel Pentium III", "Intel Pentium M", "Intel Pentium 4", "AMD K6-2", "AMD K6-III", "AMD K7 Athlon", "AMD K7 Athlon XP", "Neko Processor II"
};
static const char *samplingrate_str[] = {
@ -83,60 +83,105 @@ static int rate;
*/
int GetCpuTypeIndex(){
#if defined(CPUCORE_IA32)
if((CPU_FEATURES_ALL & CPU_FEATURES_80386) != CPU_FEATURES_80386) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_80386_FAMILY &&
np2cfg.cpu_model == CPU_80386_MODEL &&
np2cfg.cpu_stepping == CPU_80386_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_80386 &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_80386 &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_80386 &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_80386){
return 1;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_I486SX) != CPU_FEATURES_I486SX) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_I486SX_FAMILY &&
np2cfg.cpu_model == CPU_I486SX_MODEL &&
np2cfg.cpu_stepping == CPU_I486SX_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_I486SX &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_I486SX){
return 1;
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_I486SX &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_I486SX &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_I486SX &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_I486SX){
return 2;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_I486DX) != CPU_FEATURES_I486DX) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_I486DX_FAMILY &&
np2cfg.cpu_model == CPU_I486DX_MODEL &&
np2cfg.cpu_stepping == CPU_I486DX_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_I486DX &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_I486DX){
return 2;
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_I486DX &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_I486DX &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_I486DX &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_I486DX){
return 3;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM) != CPU_FEATURES_PENTIUM) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_PENTIUM &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_PENTIUM){
return 3;
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM){
return 4;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_MMX_PENTIUM) != CPU_FEATURES_MMX_PENTIUM) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_MMX_PENTIUM_FAMILY &&
np2cfg.cpu_model == CPU_MMX_PENTIUM_MODEL &&
np2cfg.cpu_stepping == CPU_MMX_PENTIUM_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_MMX_PENTIUM &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_MMX_PENTIUM){
return 4;
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_MMX_PENTIUM &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_MMX_PENTIUM &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_MMX_PENTIUM &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_MMX_PENTIUM){
return 5;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_PRO) != CPU_FEATURES_PENTIUM_PRO) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_PRO_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_PRO_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_PRO_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_PENTIUM_PRO &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_PENTIUM_PRO){
return 5;
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_PRO &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_PRO &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_PRO &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_PRO){
return 6;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_II) != CPU_FEATURES_PENTIUM_II) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_II_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_II_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_II_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_PENTIUM_II &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_PENTIUM_II){
return 6;
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_II &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_II &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_II &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_II){
return 7;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_III) != CPU_FEATURES_PENTIUM_III) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_III_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_III_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_III_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_PENTIUM_III &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_PENTIUM_III){
return 7;
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_III &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_III &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_III &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_III){
return 8;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_M) != CPU_FEATURES_PENTIUM_M) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_M_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_M_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_M_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_M &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_M &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_M &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_M){
return 9;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_PENTIUM_4) != CPU_FEATURES_PENTIUM_4) goto AMDCPUCheck;
if(np2cfg.cpu_family == CPU_PENTIUM_4_FAMILY &&
np2cfg.cpu_model == CPU_PENTIUM_4_MODEL &&
np2cfg.cpu_stepping == CPU_PENTIUM_4_STEPPING &&
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_PENTIUM_4 &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_PENTIUM_4 &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_PENTIUM_4 &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_PENTIUM_4){
return 10;
}
AMDCPUCheck:
@ -145,8 +190,10 @@ AMDCPUCheck:
if(np2cfg.cpu_family == CPU_AMD_K6_2_FAMILY &&
np2cfg.cpu_model == CPU_AMD_K6_2_MODEL &&
np2cfg.cpu_stepping == CPU_AMD_K6_2_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_AMD_K6_2 &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_AMD_K6_2){
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K6_2 &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K6_2 &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K6_2 &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K6_2){
return 15;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_AMD_K6_III) != CPU_FEATURES_AMD_K6_III ||
@ -154,8 +201,10 @@ AMDCPUCheck:
if(np2cfg.cpu_family == CPU_AMD_K6_III_FAMILY &&
np2cfg.cpu_model == CPU_AMD_K6_III_MODEL &&
np2cfg.cpu_stepping == CPU_AMD_K6_III_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_AMD_K6_III &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_AMD_K6_III){
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K6_III &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K6_III &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K6_III &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K6_III){
return 16;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_AMD_K7_ATHLON) != CPU_FEATURES_AMD_K7_ATHLON ||
@ -163,8 +212,10 @@ AMDCPUCheck:
if(np2cfg.cpu_family == CPU_AMD_K7_ATHLON_FAMILY &&
np2cfg.cpu_model == CPU_AMD_K7_ATHLON_MODEL &&
np2cfg.cpu_stepping == CPU_AMD_K7_ATHLON_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_AMD_K7_ATHLON &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_AMD_K7_ATHLON){
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K7_ATHLON &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K7_ATHLON &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K7_ATHLON &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K7_ATHLON){
return 17;
}
if((CPU_FEATURES_ALL & CPU_FEATURES_AMD_K7_ATHLON_XP) != CPU_FEATURES_AMD_K7_ATHLON_XP ||
@ -172,8 +223,10 @@ AMDCPUCheck:
if(np2cfg.cpu_family == CPU_AMD_K7_ATHLON_XP_FAMILY &&
np2cfg.cpu_model == CPU_AMD_K7_ATHLON_XP_MODEL &&
np2cfg.cpu_stepping == CPU_AMD_K7_ATHLON_XP_STEPPING &&
np2cfg.cpu_feature == CPU_FEATURES_AMD_K7_ATHLON_XP &&
np2cfg.cpu_feature_ex == CPU_FEATURES_EX_AMD_K7_ATHLON_XP){
(np2cfg.cpu_feature & CPU_FEATURES_ALL) == CPU_FEATURES_AMD_K7_ATHLON_XP &&
(np2cfg.cpu_feature_ecx & CPU_FEATURES_ECX_ALL) == CPU_FEATURES_ECX_AMD_K7_ATHLON_XP &&
(np2cfg.cpu_feature_ex & CPU_FEATURES_EX_ALL) == CPU_FEATURES_EX_AMD_K7_ATHLON_XP &&
np2cfg.cpu_eflags_mask == CPU_EFLAGS_MASK_AMD_K7_ATHLON_XP){
return 18;
}
@ -192,112 +245,184 @@ int SetCpuTypeIndex(UINT index){
switch(index){
#if defined(CPUCORE_IA32)
case 1:
np2cfg.cpu_family = CPU_80386_FAMILY;
np2cfg.cpu_model = CPU_80386_MODEL;
np2cfg.cpu_stepping = CPU_80386_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_80386;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_80386;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_80386;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_80386;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_80386);
np2cfg.cpu_brandid = CPU_BRAND_ID_80386;
break;
case 2:
np2cfg.cpu_family = CPU_I486SX_FAMILY;
np2cfg.cpu_model = CPU_I486SX_MODEL;
np2cfg.cpu_stepping = CPU_I486SX_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_I486SX;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_I486SX;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_I486SX;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_I486SX;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_I486SX);
np2cfg.cpu_brandid = CPU_BRAND_ID_I486SX;
break;
case 2:
case 3:
np2cfg.cpu_family = CPU_I486DX_FAMILY;
np2cfg.cpu_model = CPU_I486DX_MODEL;
np2cfg.cpu_stepping = CPU_I486DX_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_I486DX;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_I486DX;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_I486DX;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_I486DX;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_I486DX);
np2cfg.cpu_brandid = CPU_BRAND_ID_I486DX;
break;
case 3:
case 4:
np2cfg.cpu_family = CPU_PENTIUM_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM;
break;
case 4:
case 5:
np2cfg.cpu_family = CPU_MMX_PENTIUM_FAMILY;
np2cfg.cpu_model = CPU_MMX_PENTIUM_MODEL;
np2cfg.cpu_stepping = CPU_MMX_PENTIUM_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_MMX_PENTIUM;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_MMX_PENTIUM;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_MMX_PENTIUM;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_MMX_PENTIUM;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_MMX_PENTIUM);
np2cfg.cpu_brandid = CPU_BRAND_ID_MMX_PENTIUM;
break;
case 5:
case 6:
np2cfg.cpu_family = CPU_PENTIUM_PRO_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_PRO_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_PRO_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_PRO;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_PRO;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_PRO;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_PRO;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_PRO);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_PRO;
break;
case 6:
case 7:
np2cfg.cpu_family = CPU_PENTIUM_II_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_II_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_II_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_II;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_II;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_II;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_II;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_II);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_II;
break;
case 7:
case 8:
np2cfg.cpu_family = CPU_PENTIUM_III_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_III_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_III_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_III;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_III;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_III;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_III;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_III);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_III;
break;
case 9:
np2cfg.cpu_family = CPU_PENTIUM_M_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_M_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_M_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_M;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_M;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_M;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_M;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_M);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_M;
break;
case 10:
np2cfg.cpu_family = CPU_PENTIUM_4_FAMILY;
np2cfg.cpu_model = CPU_PENTIUM_4_MODEL;
np2cfg.cpu_stepping = CPU_PENTIUM_4_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_PENTIUM_4;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_PENTIUM_4;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_PENTIUM_4;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_PENTIUM_4;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_INTEL);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_PENTIUM_4);
np2cfg.cpu_brandid = CPU_BRAND_ID_PENTIUM_4;
break;
case 15:
np2cfg.cpu_family = CPU_AMD_K6_2_FAMILY;
np2cfg.cpu_model = CPU_AMD_K6_2_MODEL;
np2cfg.cpu_stepping = CPU_AMD_K6_2_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_AMD_K6_2;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K6_2;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K6_2;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K6_2;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K6_2);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K6_2;
break;
case 16:
np2cfg.cpu_family = CPU_AMD_K6_III_FAMILY;
np2cfg.cpu_model = CPU_AMD_K6_III_MODEL;
np2cfg.cpu_stepping = CPU_AMD_K6_III_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_AMD_K6_III;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K6_III;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K6_III;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K6_III;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K6_III);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K6_III;
break;
case 17:
np2cfg.cpu_family = CPU_AMD_K7_ATHLON_FAMILY;
np2cfg.cpu_model = CPU_AMD_K7_ATHLON_MODEL;
np2cfg.cpu_stepping = CPU_AMD_K7_ATHLON_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_AMD_K7_ATHLON;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K7_ATHLON;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K7_ATHLON;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K7_ATHLON;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K7_ATHLON);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K7_ATHLON;
break;
case 18:
np2cfg.cpu_family = CPU_AMD_K7_ATHLON_XP_FAMILY;
np2cfg.cpu_model = CPU_AMD_K7_ATHLON_XP_MODEL;
np2cfg.cpu_stepping = CPU_AMD_K7_ATHLON_XP_STEPPING;
np2cfg.cpu_feature = CPU_FEATURES_AMD_K7_ATHLON_XP;
np2cfg.cpu_feature_ecx = CPU_FEATURES_ECX_AMD_K7_ATHLON_XP;
np2cfg.cpu_feature_ex = CPU_FEATURES_EX_AMD_K7_ATHLON_XP;
np2cfg.cpu_eflags_mask = CPU_EFLAGS_MASK_AMD_K7_ATHLON_XP;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_AMD);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_AMD_K7_ATHLON_XP);
np2cfg.cpu_brandid = CPU_BRAND_ID_AMD_K7_ATHLON_XP;
break;
case 255: // 全機能使用可能
np2cfg.cpu_family = 0;
np2cfg.cpu_model = 0;
np2cfg.cpu_stepping = 0;
np2cfg.cpu_feature = 0;
np2cfg.cpu_feature_ecx = 0;
np2cfg.cpu_feature_ex = 0;
np2cfg.cpu_eflags_mask = 0;
strcpy(np2cfg.cpu_vendor, CPU_VENDOR_NEKOPRO);
strcpy(np2cfg.cpu_brandstring, CPU_BRAND_STRING_NEKOPRO);
np2cfg.cpu_brandid = 0;
break;
#endif
default:
@ -372,21 +497,24 @@ ok_button_clicked(GtkButton *b, gpointer d)
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
SetCpuTypeIndex(i);
break;
case 8:
case 11:
SetCpuTypeIndex(15);
break;
case 9:
case 12:
SetCpuTypeIndex(16);
break;
case 10:
case 13:
SetCpuTypeIndex(17);
break;
case 11:
case 14:
SetCpuTypeIndex(18);
break;
case 12:
case 15:
SetCpuTypeIndex(255);
break;
}
@ -680,23 +808,26 @@ create_configure_dialog(void)
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
j = i;
break;
case 15:
j = 8;
break;
case 16:
j = 9;
break;
case 17:
j = 10;
break;
case 18:
j = 11;
break;
case 255:
case 16:
j = 12;
break;
case 17:
j = 13;
break;
case 18:
j = 14;
break;
case 255:
j = 15;
break;
default:
j = 0;
}

View File

@ -324,29 +324,34 @@ static GtkRadioActionEntry beepvol_entries[] = {
static const guint n_beepvol_entries = G_N_ELEMENTS(beepvol_entries);
static GtkRadioActionEntry soundboard_entries[] = {
{ "disableboards", NULL, "_Disable boards", NULL, NULL, 0x00 },
{ "pc-9801-14", NULL, "PC-9801-_14", NULL, NULL, 0x01 },
{ "pc-9801-26k", NULL, "PC-9801-_26K", NULL, NULL, 0x02 },
{ "pc-9801-86", NULL, "PC-9801-8_6", NULL, NULL, 0x04 },
{ "pc-9801-26k-86", NULL, "PC-9801-26_K + 86", NULL, NULL, 0x06 },
{ "pc-9801-86-cb", NULL, "PC-9801-86 + _Chibi-oto", NULL, NULL, 0x14 },
{ "pc-9801-118", NULL, "PC-9801-11_8", NULL, NULL, 0x08 },
{ "pc-9801-86-mx", NULL, "PC-9801-86 + Mate-X PCM(B460)", NULL, NULL, 0x64 },
{ "pc-9801-86-118", NULL, "PC-9801-86 + 118", NULL, NULL, 0x68 },
{ "pc-9801-mx", NULL, "Mate-X PCM(B460)", NULL, NULL, 0x60 },
{ "speakboard", NULL, "S_peak board", NULL, NULL, 0x20 },
{ "speakboard86", NULL, "PC-9801-86 + Speak board", NULL, NULL, 0x24 },
{ "sparkboard", NULL, "Sp_ark board", NULL, NULL, 0x40 },
{ "sndorchestra", NULL, "Sound Orchestra", NULL, NULL, 0x32 },
{ "sndorchestrav", NULL, "Sound Orchestra-V", NULL, NULL, 0x82 },
{ "disableboards", NULL, "_Disable boards", NULL, NULL, 0x00 },
{ "pc-9801-14", NULL, "PC-9801-_14", NULL, NULL, 0x01 },
{ "pc-9801-26k", NULL, "PC-9801-_26K", NULL, NULL, 0x02 },
{ "pc-9801-86", NULL, "PC-9801-8_6", NULL, NULL, 0x04 },
{ "pc-9801-26k-86", NULL, "PC-9801-26_K + 86", NULL, NULL, 0x06 },
{ "pc-9801-86-cb", NULL, "PC-9801-86 + _Chibi-oto", NULL, NULL, 0x14 },
{ "pc-9801-118", NULL, "PC-9801-11_8", NULL, NULL, 0x08 },
{ "pc-9801-86-mx", NULL, "PC-9801-86 + Mate-X PCM(B460)", NULL, NULL, SOUNDID_PC_9801_86_WSS },
{ "pc-9801-86-118", NULL, "PC-9801-86 + 118(B460)", NULL, NULL, SOUNDID_PC_9801_86_118 },
{ "pc-9801-mx", NULL, "Mate-X PCM", NULL, NULL, SOUNDID_MATE_X_PCM },
{ "speakboard", NULL, "S_peak board", NULL, NULL, 0x20 },
{ "speakboard86", NULL, "PC-9801-86 + Speak board", NULL, NULL, SOUNDID_86_SPEAKBOARD },
{ "sparkboard", NULL, "Sp_ark board", NULL, NULL, 0x40 },
{ "sndorchestra", NULL, "Sound Orchestra", NULL, NULL, 0x32 },
{ "sndorchestrav", NULL, "Sound Orchestra-V", NULL, NULL, 0x82 },
#if defined(SUPPORT_SOUND_SB16)
{ "sb16", NULL, "Sound Blaster 16", NULL, NULL, 0x41 },
{ "sb16", NULL, "Sound Blaster 16", NULL, NULL, SOUNDID_SB16 },
{ "pc-9801-86-sb16", NULL, "PC-9801-86 + Sound Blaster 16", NULL, NULL, SOUNDID_PC_9801_86_SB16 },
{ "pc-9801-mx-sb16", NULL, "Mate-X PCM + Sound Blaster 16", NULL, NULL, SOUNDID_WSS_SB16 },
{ "pc-9801-118-sb16", NULL, "PC-9801-118 + Sound Blaster 16", NULL, NULL, SOUNDID_PC_9801_118_SB16 },
{ "pc-9801-86-mx-sb16", NULL, "PC-9801-86 + Mate-X PCM(B460) + Sound Blaster 16", NULL, NULL, SOUNDID_PC_9801_86_WSS_SB16 },
{ "pc-9801-86-118-sb16", NULL, "PC-9801-86 + 118(B460) + Sound Blaster 16", NULL, NULL, SOUNDID_PC_9801_86_118_SB16 },
#endif /* SUPPORT_SOUND_SB16 */
{ "amd98", NULL, "_AMD98", NULL, NULL, 0x80 },
{ "wavestar", NULL, "_WaveStar", NULL, NULL, 0x70 },
{ "amd98", NULL, "_AMD98", NULL, NULL, 0x80 },
{ "wavestar", NULL, "_WaveStar", NULL, NULL, 0x70 },
#if defined(SUPPORT_PX)
{ "px1", NULL, "Otomi-chanx2", NULL, NULL, 0x30 },
{ "px2", NULL, "Otomi-chanx2 + 86", NULL, NULL, 0x50 },
{ "px1", NULL, "Otomi-chanx2", NULL, NULL, 0x30 },
{ "px2", NULL, "Otomi-chanx2 + 86", NULL, NULL, 0x50 },
#endif /* SUPPORT_PX */
};
static const guint n_soundboard_entries = G_N_ELEMENTS(soundboard_entries);
@ -564,6 +569,11 @@ static const gchar *ui_info =
" <menuitem action='sndorchestrav'/>\n"
#if defined(SUPPORT_SOUND_SB16)
" <menuitem action='sb16'/>\n"
" <menuitem action='pc-9801-86-sb16'/>\n"
" <menuitem action='pc-9801-mx-sb16'/>\n"
" <menuitem action='pc-9801-118-sb16'/>\n"
" <menuitem action='pc-9801-86-mx-sb16'/>\n"
" <menuitem action='pc-9801-86-118-sb16'/>\n"
#endif /* SUPPORT_SOUND_SB16 */
" <menuitem action='amd98'/>\n"
" <menuitem action='wavestar'/>\n"

View File

@ -600,6 +600,7 @@ static INITBL iniitem[] = {
{"optsb16p", INITYPE_HEX8, &np2cfg.sndsb16io, 0},
{"optsb16d", INITYPE_UINT8, &np2cfg.sndsb16dma, 0},
{"optsb16i", INITYPE_UINT8, &np2cfg.sndsb16irq, 0},
{"optsb16A", INITYPE_BOOL, &np2cfg.sndsb16at, 0},
#endif /* SUPPORT_SOUND_SB16 */
{"volume_F", INIMAX_UINT8, &np2cfg.vol_fm, 128},
@ -691,6 +692,9 @@ static INITBL iniitem[] = {
{"cpu_feat", INITYPE_HEX32, &np2cfg.cpu_feature, 0},
{"cpu_f_ex", INITYPE_HEX32, &np2cfg.cpu_feature_ex, 0},
{"cpu_bran", INIRO_STR, np2cfg.cpu_brandstring_o, 63},
{"cpu_brid", INITYPE_HEX32, &np2cfg.cpu_brandid, 0},
{"cpu_fecx", INITYPE_HEX32, &np2cfg.cpu_feature_ecx, 0},
{"cpu_eflg", INITYPE_HEX32, &np2cfg.cpu_eflags_mask, 0},
{"FPU_TYPE", INITYPE_UINT8, &np2cfg.fpu_type, 0},
#if defined(SUPPORT_FAST_MEMORYCHECK)
@ -703,6 +707,9 @@ static INITBL iniitem[] = {
#if defined(SUPPORT_IDEIO)
{"IDEBADDR", INIRO_HEX8, &np2cfg.idebaddr, 0},
#endif
#if defined(SUPPORT_GAMEPORT)
{"GAMEPORT", INITYPE_BOOL, &np2cfg.gameport, 0},
#endif
{"keyboard", INITYPE_KB, &np2oscfg.KEYBOARD, 0},
{"F12_COPY", INITYPE_UINT8, &np2oscfg.F12KEY, 0},