|
|
| version 1.5, 2003/10/27 15:06:31 | version 1.16, 2007/11/03 00:00:21 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "joymng.h" | #include "joymng.h" |
| #include "soundmng.h" | #include "soundmng.h" |
| #include "i286.h" | |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "cbuscore.h" | #include "cbuscore.h" |
| Line 11 | Line 10 |
| #include "boardx2.h" | #include "boardx2.h" |
| #include "board118.h" | #include "board118.h" |
| #include "boardspb.h" | #include "boardspb.h" |
| #if defined(SUPPORT_PX) | |
| #include "boardpx.h" | |
| #endif // defined(SUPPORT_PX) | |
| #include "amd98.h" | #include "amd98.h" |
| #include "pcm86io.h" | #include "pcm86io.h" |
| #include "cs4231io.h" | #include "cs4231io.h" |
| Line 18 | Line 20 |
| #include "fmboard.h" | #include "fmboard.h" |
| #include "beep.h" | #include "beep.h" |
| #include "keydisp.h" | #include "keydisp.h" |
| #include "keystat.h" | |
| int usesound = 0; | UINT32 usesound; |
| OPN_T opn; | |
| AMD98 amd98; | |
| MUSICGEN musicgen; | |
| _TMS3631 tms3631; | _TMS3631 tms3631; |
| _FMTIMER fmtimer; | _FMTIMER fmtimer; |
| _OPNGEN opngen; | _OPNGEN opngen; |
| OPNCH opnch[OPNCH_MAX]; | OPNCH opnch[OPNCH_MAX]; |
| _PSGGEN psg1; | _PSGGEN __psg[3]; |
| _PSGGEN psg2; | |
| _PSGGEN psg3; | |
| _RHYTHM rhythm; | _RHYTHM rhythm; |
| _ADPCM adpcm; | _ADPCM adpcm; |
| _PCM86 pcm86; | _PCM86 pcm86; |
| _CS4231 cs4231; | _CS4231 cs4231; |
| #if defined(SUPPORT_PX) | |
| OPN_T opn; | OPN_T opn2; |
| AMD98 amd98; | OPN_T opn3; |
| MUSICGEN musicgen; | _RHYTHM rhythm2; |
| _RHYTHM rhythm3; | |
| _ADPCM adpcm2; | |
| _ADPCM adpcm3; | |
| #endif // defined(SUPPORT_PX) | |
| static void (*extfn)(BYTE enable); | static void (*extfn)(REG8 enable); |
| // ---- | // ---- |
| static BYTE rapids = 0; | static REG8 rapids = 0; |
| BYTE fmboard_getjoy(PSGGEN psg) { | REG8 fmboard_getjoy(PSGGEN psg) { |
| BYTE ret; | REG8 ret; |
| rapids ^= 0xf0; // ver0.28 | rapids ^= 0xf0; // ver0.28 |
| ret = 0xff; | ret = 0xff; |
| if (!(psg->reg.io2 & 0x40)) { | if (!(psg->reg.io2 & 0x40)) { |
| ret &= (joymng_getstat() | (rapids & 0x30)); | ret &= (joymng_getstat() | (rapids & 0x30)); |
| if (np2cfg.KEY_MODE == 1) { | if (np2cfg.KEY_MODE == 1) { |
| ret &= keyext_getjoy(); | ret &= keystat_getjoy(); |
| } | } |
| } | } |
| else { | else { |
| if (np2cfg.KEY_MODE == 2) { | if (np2cfg.KEY_MODE == 2) { |
| ret &= keyext_getjoy(); | ret &= keystat_getjoy(); |
| } | } |
| } | } |
| if (np2cfg.BTN_RAPID) { | if (np2cfg.BTN_RAPID) { |
| Line 72 BYTE fmboard_getjoy(PSGGEN psg) { | Line 80 BYTE fmboard_getjoy(PSGGEN psg) { |
| ret &= ((ret >> 2) | (~0x30)); | ret &= ((ret >> 2) | (~0x30)); |
| if (np2cfg.BTN_MODE) { | if (np2cfg.BTN_MODE) { |
| BYTE bit1 = (ret & 0x20) >> 1; // ver0.28 | UINT8 bit1 = (ret & 0x20) >> 1; // ver0.28 |
| BYTE bit2 = (ret & 0x10) << 1; | UINT8 bit2 = (ret & 0x10) << 1; |
| ret = (ret & (~0x30)) | bit1 | bit2; | ret = (ret & (~0x30)) | bit1 | bit2; |
| } | } |
| Line 86 BYTE fmboard_getjoy(PSGGEN psg) { | Line 94 BYTE fmboard_getjoy(PSGGEN psg) { |
| // ---- | // ---- |
| void fmboard_extreg(void (*ext)(BYTE enable)) { | void fmboard_extreg(void (*ext)(REG8 enable)) { |
| extfn = ext; | extfn = ext; |
| } | } |
| void fmboard_extenable(BYTE enable) { | void fmboard_extenable(REG8 enable) { |
| if (extfn) { | if (extfn) { |
| (*extfn)(enable); | (*extfn)(enable); |
| Line 102 void fmboard_extenable(BYTE enable) { | Line 110 void fmboard_extenable(BYTE enable) { |
| // ---- | // ---- |
| void fmboard_reset(BYTE num) { | static void setfmregs(UINT8 *reg) { |
| BYTE cross; | FillMemory(reg + 0x30, 0x60, 0xff); |
| FillMemory(reg + 0x90, 0x20, 0x00); | |
| FillMemory(reg + 0xb0, 0x04, 0x00); | |
| FillMemory(reg + 0xb4, 0x04, 0xc0); | |
| } | |
| void fmboard_reset(const NP2CFG *pConfig, UINT32 type) { | |
| UINT8 cross; | |
| soundrom_reset(); | soundrom_reset(); |
| beep_reset(); // ver0.27a | beep_reset(); // ver0.27a |
| cross = np2cfg.snd_x; // ver0.30 | cross = np2cfg.snd_x; // ver0.30 |
| usesound = num; | |
| extfn = NULL; | extfn = NULL; |
| ZeroMemory(&opn, sizeof(opn)); | ZeroMemory(&opn, sizeof(opn)); |
| setfmregs(opn.reg + 0x000); | |
| setfmregs(opn.reg + 0x100); | |
| setfmregs(opn.reg + 0x200); | |
| setfmregs(opn.reg + 0x300); | |
| opn.reg[0xff] = 0x01; | |
| opn.channels = 3; | |
| opn.adpcmmask = (UINT8)~(0x1c); | |
| #if defined(SUPPORT_PX) | |
| ZeroMemory(&opn2, sizeof(opn2)); | |
| setfmregs(opn2.reg + 0x000); | |
| setfmregs(opn2.reg + 0x100); | |
| setfmregs(opn2.reg + 0x200); | |
| setfmregs(opn2.reg + 0x300); | |
| opn2.reg[0xff] = 0x01; | |
| opn2.channels = 3; | |
| opn2.adpcmmask = (UINT8)~(0x1c); | |
| ZeroMemory(&opn3, sizeof(opn3)); | |
| setfmregs(opn3.reg + 0x000); | |
| setfmregs(opn3.reg + 0x100); | |
| setfmregs(opn3.reg + 0x200); | |
| setfmregs(opn3.reg + 0x300); | |
| opn3.reg[0xff] = 0x01; | |
| opn3.channels = 3; | |
| opn3.adpcmmask = (UINT8)~(0x1c); | |
| #endif // defined(SUPPORT_PX) | |
| ZeroMemory(&musicgen, sizeof(musicgen)); | ZeroMemory(&musicgen, sizeof(musicgen)); |
| ZeroMemory(&amd98, sizeof(amd98)); | ZeroMemory(&amd98, sizeof(amd98)); |
| opn.channels = 3; | |
| opn.adpcmmask = (BYTE)~(0x1c); | |
| opn.reg[0xff] = 0x01; | |
| tms3631_reset(&tms3631); | tms3631_reset(&tms3631); |
| opngen_reset(); | opngen_reset(); |
| psggen_reset(&psg1); | psggen_reset(&psg1); |
| psggen_reset(&psg2); | psggen_reset(&psg2); |
| psggen_reset(&psg3); | psggen_reset(&psg3); |
| rhythm_reset(&rhythm); | rhythm_reset(&rhythm); |
| #if defined(SUPPORT_PX) | |
| rhythm_reset(&rhythm2); | |
| rhythm_reset(&rhythm3); | |
| #endif // defined(SUPPORT_PX) | |
| adpcm_reset(&adpcm); | adpcm_reset(&adpcm); |
| #if defined(SUPPORT_PX) | |
| adpcm_reset(&adpcm2); | |
| adpcm_reset(&adpcm3); | |
| #endif // defined(SUPPORT_PX) | |
| pcm86_reset(); | pcm86_reset(); |
| cs4231_reset(); | cs4231_reset(); |
| switch(num) { | switch(type) { |
| case 0x01: | case 0x01: |
| board14_reset(); | board14_reset(pConfig); |
| break; | break; |
| case 0x02: | case 0x02: |
| board26k_reset(); | board26k_reset(pConfig); |
| break; | break; |
| case 0x04: | case 0x04: |
| board86_reset(); | board86_reset(pConfig); |
| break; | break; |
| case 0x06: | case 0x06: |
| boardx2_reset(); | boardx2_reset(pConfig); |
| break; | break; |
| case 0x08: | case 0x08: |
| board118_reset(); | board118_reset(pConfig); |
| break; | break; |
| case 0x14: | case 0x14: |
| board86_reset(); | board86_reset(pConfig); |
| break; | break; |
| case 0x20: | case 0x20: |
| boardspb_reset(); | boardspb_reset(pConfig); |
| cross ^= np2cfg.spb_x; | cross ^= pConfig->spb_x; |
| break; | break; |
| case 0x40: | case 0x40: |
| boardspr_reset(); | boardspr_reset(pConfig); |
| cross ^= np2cfg.spb_x; | cross ^= pConfig->spb_x; |
| break; | break; |
| case 0x80: | case 0x80: |
| // amd98_reset(); | // amd98_reset(pConfig); |
| break; | break; |
| #if defined(SUPPORT_PX) | |
| case 0x30: | |
| boardpx1_reset(pConfig); | |
| break; | |
| case 0x50: | |
| boardpx2_reset(pConfig); | |
| break; | |
| #endif // defined(SUPPORT_PX) | |
| default: | default: |
| usesound = 0; | type = 0; |
| break; | break; |
| } | } |
| usesound = type; | |
| soundmng_setreverse(cross); | soundmng_setreverse(cross); |
| keydisp_setfmboard(num); | keydisp_setfmboard(type); |
| opngen_setVR(np2cfg.spb_vrc, np2cfg.spb_vrl); | opngen_setVR(pConfig->spb_vrc, pConfig->spb_vrl); |
| } | } |
| void fmboard_bind(void) { | void fmboard_bind(void) { |
| Line 216 void fmboard_bind(void) { | Line 274 void fmboard_bind(void) { |
| case 0x80: | case 0x80: |
| amd98_bind(); | amd98_bind(); |
| break; | break; |
| #if defined(SUPPORT_PX) | |
| case 0x30: | |
| boardpx1_bind(); | |
| break; | |
| case 0x50: | |
| boardpx2_bind(); | |
| break; | |
| #endif // defined(SUPPORT_PX) | |
| } | } |
| sound_streamregist(&beep, (SOUNDCB)beep_getpcm); | sound_streamregist(&beep, (SOUNDCB)beep_getpcm); |
| } | } |
| // ---- | |
| void fmboard_fmrestore(REG8 chbase, UINT bank) { | |
| REG8 i; | |
| const UINT8 *reg; | |
| reg = opn.reg + (bank * 0x100); | |
| for (i=0x30; i<0xa0; i++) { | |
| opngen_setreg(chbase, i, reg[i]); | |
| } | |
| for (i=0xb7; i>=0xa0; i--) { | |
| opngen_setreg(chbase, i, reg[i]); | |
| } | |
| for (i=0; i<3; i++) { | |
| opngen_keyon(chbase + i, opngen.keyreg[chbase + i]); | |
| } | |
| } | |
| void fmboard_rhyrestore(RHYTHM rhy, UINT bank) { | |
| const UINT8 *reg; | |
| reg = opn.reg + (bank * 0x100); | |
| rhythm_setreg(rhy, 0x11, reg[0x11]); | |
| rhythm_setreg(rhy, 0x18, reg[0x18]); | |
| rhythm_setreg(rhy, 0x19, reg[0x19]); | |
| rhythm_setreg(rhy, 0x1a, reg[0x1a]); | |
| rhythm_setreg(rhy, 0x1b, reg[0x1b]); | |
| rhythm_setreg(rhy, 0x1c, reg[0x1c]); | |
| rhythm_setreg(rhy, 0x1d, reg[0x1d]); | |
| } | |
| #if defined(SUPPORT_PX) | |
| void fmboard_fmrestore2(OPN_T* pOpn, REG8 chbase, UINT bank) { | |
| REG8 i; | |
| const UINT8 *reg; | |
| reg = pOpn->reg + (bank * 0x100); | |
| for (i=0x30; i<0xa0; i++) { | |
| opngen_setreg(chbase, i, reg[i]); | |
| } | |
| for (i=0xb7; i>=0xa0; i--) { | |
| opngen_setreg(chbase, i, reg[i]); | |
| } | |
| for (i=0; i<3; i++) { | |
| opngen_keyon(chbase + i, opngen.keyreg[chbase + i]); | |
| } | |
| } | |
| void fmboard_rhyrestore2(OPN_T* pOpn, RHYTHM rhy, UINT bank) { | |
| const UINT8 *reg; | |
| reg = pOpn->reg + (bank * 0x100); | |
| rhythm_setreg(rhy, 0x11, reg[0x11]); | |
| rhythm_setreg(rhy, 0x18, reg[0x18]); | |
| rhythm_setreg(rhy, 0x19, reg[0x19]); | |
| rhythm_setreg(rhy, 0x1a, reg[0x1a]); | |
| rhythm_setreg(rhy, 0x1b, reg[0x1b]); | |
| rhythm_setreg(rhy, 0x1c, reg[0x1c]); | |
| rhythm_setreg(rhy, 0x1d, reg[0x1d]); | |
| } | |
| #endif // defined(SUPPORT_PX) | |