mirror of
https://github.com/libretro/NP2kai.git
synced 2024-10-07 06:43:29 +00:00
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:
parent
c0fd97acb3
commit
3045b0574d
@ -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>
|
||||
|
12
bios/bios.c
12
bios/bios.c
@ -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;
|
||||
|
244
cbus/board118.c
244
cbus/board118.c
@ -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);
|
||||
@ -624,6 +743,16 @@ void board118_bind(void)
|
||||
cbuscore_attachsndex(cs4231.port[4],ymf_o, ymf_i);
|
||||
}
|
||||
|
||||
#if defined(SUPPORT_GAMEPORT)
|
||||
// ゲームポート割り当て 1480h~1487hどこでも良いらしい
|
||||
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
|
||||
iocore_attachout(cs4231.port[9], sb16_o20d2);
|
||||
@ -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)
|
||||
// ゲームポート割り当て 1480h~1487hどこでも良いらしい
|
||||
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
|
||||
}
|
||||
|
367
cbus/boardsb16.c
367
cbus/boardsb16.c
@ -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();
|
||||
@ -222,28 +431,73 @@ void boardsb16_bind(void) {
|
||||
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 */
|
||||
|
||||
if (!opl3) {
|
||||
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 (!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();
|
||||
@ -270,16 +524,43 @@ void boardsb16_unbind(void) {
|
||||
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
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -196,12 +196,12 @@ void cs4231io_reset(void) {
|
||||
100b〜101b= 未定義
|
||||
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);
|
||||
|
947
cbus/ct1741io.c
947
cbus/ct1741io.c
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
175
cbus/ct1745io.c
175
cbus/ct1745io.c
@ -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
|
@ -36,6 +36,7 @@ void ct1745io_reset(void);
|
||||
void ct1745io_bind(void);
|
||||
void ct1745io_unbind(void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
10
cbus/ideio.c
10
cbus/ideio.c
@ -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{
|
||||
|
@ -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) {
|
||||
@ -1037,12 +1067,13 @@ REG8 IOINPCALL mpu98ii_i2(UINT port) {
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -27,7 +27,7 @@ enum
|
||||
|
||||
enum
|
||||
{
|
||||
KEYDISP_CHMAX = 48,
|
||||
KEYDISP_CHMAX = 64,
|
||||
};
|
||||
|
||||
enum
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
280
i386c/ia32/instructions/sse2/sse2.c
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
@ -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){
|
||||
|
@ -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;
|
||||
}
|
||||
|
20
io/dmac.c
20
io/dmac.c
@ -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];
|
||||
}
|
||||
|
@ -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);
|
||||
|
52
io/serial.c
52
io/serial.c
@ -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)) {
|
||||
|
15
nevent.c
15
nevent.c
@ -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)
|
||||
{
|
||||
|
2
nevent.h
2
nevent.h
@ -135,6 +135,8 @@ SINT32 nevent_getremain(NEVENTID id);
|
||||
// NEVENTの強制脱出
|
||||
void nevent_forceexit(void);
|
||||
|
||||
void nevent_changeclock(UINT32 oldclock, UINT32 newclock);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
34
pccore.c
34
pccore.c
@ -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 */
|
||||
|
11
pccore.h
11
pccore.h
@ -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]; // ブランド名(48byte)OEMCHAR
|
||||
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 */
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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__)
|
||||
|
@ -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)
|
||||
|
@ -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 },
|
||||
|
351
sdl2/np2.c
351
sdl2/np2.c
@ -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
|
||||
|
||||
|
@ -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__ */
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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,
|
||||
|
@ -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},
|
||||
|
108
sound/fmboard.c
108
sound/fmboard.c
@ -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)
|
||||
|
@ -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
122
sound/mame/ymf262.c
Executable file → Normal 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];
|
||||
|
97
statsave.c
97
statsave.c
@ -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;
|
||||
@ -875,6 +886,27 @@ static UINT GetSoundFlags(SOUNDID nSoundID)
|
||||
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:
|
||||
return FLAG_OPNA1 | FLAG_OPNA2 | FLAG_OPNA3 | FLAG_OPNA4;
|
||||
@ -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));
|
||||
}
|
||||
|
||||
// 復元。 これ移動すること!
|
||||
|
@ -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},
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
54
win9x/commng/cmbase.cpp
Executable file → Normal 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
34
win9x/commng/cmbase.h
Executable file → Normal 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
|
||||
{
|
||||
@ -31,22 +31,40 @@ protected:
|
||||
virtual UINT Write(UINT8 cData) = 0;
|
||||
|
||||
/**
|
||||
* ステータスを得る
|
||||
* @return ステータス
|
||||
* Write Retry
|
||||
* @return result
|
||||
*/
|
||||
virtual UINT WriteRetry(){
|
||||
return 1; // 常時成功扱い
|
||||
}
|
||||
|
||||
/**
|
||||
* Last Write Success
|
||||
* @return result
|
||||
*/
|
||||
virtual UINT LastWriteSuccess(){
|
||||
return 1; // 常時成功扱い
|
||||
}
|
||||
|
||||
/**
|
||||
* ステータスを得る
|
||||
* @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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
119
win9x/commng/cmserial.cpp
Executable file → Normal 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
13
win9x/commng/cmserial.h
Executable file → Normal 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);
|
||||
};
|
||||
|
@ -818,7 +818,7 @@ UINT CComWacom::Write(UINT8 cData)
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
195
win9x/dialog/d_config.cpp
Executable file → Normal file
195
win9x/dialog/d_config.cpp
Executable file → Normal 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
142
win9x/dialog/d_serial.cpp
Executable file → Normal 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)
|
||||
{
|
||||
|
@ -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
22
win9x/joymng.cpp
Executable file → Normal 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;
|
||||
|
@ -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));
|
||||
|
@ -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)
|
||||
|
@ -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>
|
||||
|
@ -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]=='¥¥'))){
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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},
|
||||
|
Loading…
Reference in New Issue
Block a user