Ejemplo n.º 1
0
static void IOOUTCALL opn_o08a(UINT port, REG8 dat) {

    UINT	addr;

    opn.data2 = dat;
    addr = opn.addr2;
    if (addr < 0x10) {
        if (addr != 0x0e) {
            psggen_setreg(&psg1, addr, dat);
        }
    }
    else {
        if (addr < 0x30) {
            if (addr == 0x28) {
                if ((dat & 0x0f) < 3) {
                    opngen_keyon(dat & 0x0f, dat);
                }
            }
            else {
                fmtimer_setreg(addr, dat);
                if (addr == 0x27) {
                    opnch[2].extop = dat & 0xc0;
                }
            }
        }
        else if (addr < 0xc0) {
            opngen_setreg(0, addr, dat);
        }
        opn.reg[addr + 0x200] = dat;
    }
    (void)port;
}
Ejemplo n.º 2
0
static void IOOUTCALL opn_o18a(UINT port, REG8 dat) {

	UINT	addr;

	g_opn.data1 = dat;
	addr = g_opn.addr1l;
	S98_put(NORMAL2608, addr, dat);
	g_opn.reg[addr] = dat;
	if (addr < 0x10) {
		psggen_setreg(&g_psg1, addr, dat);
	}
	else if (addr < 0x100) {
		if (addr < 0x30) {
			if (addr == 0x28) {
				if ((dat & 0x0f) < 3) {
					opngen_keyon(&g_opngen, dat & 0x0f, dat);
				}
			}
			else {
				fmtimer_setreg(addr, dat);
				if (addr == 0x27) {
					g_opngen.opnch[2].extop = dat & 0xc0;
				}
			}
		}
		else if (addr < 0xc0) {
			opngen_setreg(&g_opngen, 0, addr, dat);
		}
	}
	(void)port;
}
Ejemplo n.º 3
0
void psggen_restore(PSGGEN psg) {

	REG8	i;

	for (i=0; i<0x0e; i++) {
		psggen_setreg(psg, i, ((UINT8 *)&psg->reg)[i]);
	}
}
Ejemplo n.º 4
0
void psggen_reset(PSGGEN psg) {

	UINT	i;

	ZeroMemory(psg, sizeof(_PSGGEN));
	for (i=0; i<3; i++) {
		psg->tone[i].pvol = psggencfg.volume + 0;
	}
	for (i=0; i<sizeof(psggen_deftbl); i++) {
		psggen_setreg(psg, (REG8)i, psggen_deftbl[i]);
	}
}
Ejemplo n.º 5
0
void psggen_reset(PSGGEN psg) {

	UINT	i;

	memset(psg, 0, sizeof(*psg));
	for (i=0; i<3; i++) {
		psg->tone[i].pvol = psggencfg.volume + 0;
	}
	psg->noise.lfsr = 1;
	for (i=0; i<sizeof(psggen_deftbl); i++) {
		psggen_setreg(psg, i, psggen_deftbl[i]);
	}
}
Ejemplo n.º 6
0
static void IOOUTCALL opna_o18a(UINT port, REG8 dat) {

    UINT	addr;

    opn.data = dat;
    addr = opn.addr;
    if (addr >= 0x100) {
        return;
    }
    S98_put(NORMAL2608, addr, dat);
    if (addr < 0x10) {
        if (addr != 0x0e) {
            psggen_setreg(&psg2, addr, dat);
        }
    }
    else {
        if (addr < 0x20) {
            if (opn.extend) {
                rhythm_setreg(&rhythm, addr, dat);
            }
        }
        else if (addr < 0x30) {
            if (addr == 0x28) {
                if ((dat & 0x0f) < 3) {
                    opngen_keyon((dat & 0x0f) + 3, dat);
                }
                else if (((dat & 0x0f) != 3) &&
                         ((dat & 0x0f) < 7)) {
                    opngen_keyon((dat & 0x0f) + 2, dat);
                }
            }
            else {
                fmtimer_setreg(addr, dat);
                if (addr == 0x27) {
                    opnch[2].extop = dat & 0xc0;
                }
            }
        }
        else if (addr < 0xc0) {
            opngen_setreg(3, addr, dat);
        }
        opn.reg[addr] = dat;
    }
    (void)port;
}
Ejemplo n.º 7
0
static void IOOUTCALL ymf_o18a(UINT port, REG8 dat) {

	UINT	addr;

	opn.data = dat;
	addr = opn.addr;
	if (addr >= 0x100) {
		return;
	}
	S98_put(NORMAL2608, addr, dat);
	if (addr < 0x10) {
		if (addr != 0x0e) {
			psggen_setreg(&psg1, addr, dat);
		}
	}
	else {
		if (addr < 0x20) {
			rhythm_setreg(&rhythm, addr, dat);
		}
		else if (addr < 0x30) {
			if (addr == 0x28) {
				if ((dat & 0x0f) < 3) {
					opngen_keyon(dat & 0x0f, dat);
				}
				else if (((dat & 0x0f) != 3) &&
						((dat & 0x0f) < 7)) {
					opngen_keyon((dat & 0x07) - 1, dat);
				}
			}
			else {
				fmtimer_setreg(addr, dat);
			}
		}
		else if (addr < 0xc0) {
			opngen_setreg(0, addr, dat);
		}
		opn.reg[addr] = dat;
	}
	(void)port;
}
Ejemplo n.º 8
0
static void IOOUTCALL ymf_o18a(UINT port, REG8 dat) {

	UINT	addr;

	g_opn.data1 = dat;
	if (g_opn.addr1h != 0) {
		return;
	}

	addr = g_opn.addr1l;
	S98_put(NORMAL2608, addr, dat);
	g_opn.reg[addr] = dat;
	if (addr < 0x10) {
		psggen_setreg(&g_psg1, addr, dat);
	}
	else {
		if (addr < 0x20) {
			rhythm_setreg(&g_rhythm, addr, dat);
		}
		else if (addr < 0x30) {
			if (addr == 0x28) {
				if ((dat & 0x0f) < 3) {
					opngen_keyon(&g_opngen, dat & 0x0f, dat);
				}
				else if (((dat & 0x0f) != 3) &&
						((dat & 0x0f) < 7)) {
					opngen_keyon(&g_opngen, (dat & 0x07) - 1, dat);
				}
			}
			else {
				fmtimer_setreg(addr, dat);
			}
		}
		else if (addr < 0xc0) {
			opngen_setreg(&g_opngen, 0, addr, dat);
		}
	}
	(void)port;
}
Ejemplo n.º 9
0
static void IOOUTCALL p86_o28a(UINT port, REG8 dat) {

	UINT	addr;

//	g_opn3.data1 = dat;
	addr = g_opn3.addr1l;
//	S98_put(NORMAL2608, addr, dat);
	g_opn3.reg[addr] = dat;
	if (addr < 0x10) {
		psggen_setreg(&g_psg3, addr, dat);
	}
	else {
		if (addr < 0x20) {
			rhythm_setreg(&g_rhythm3, addr, dat);
		}
		else if (addr < 0x30) {
			if (addr == 0x28) {
				if ((dat & 0x0f) < 3) {
					opngen_keyon(&g_opngen, (dat & 0x0f) + 24, dat);
				}
				else if (((dat & 0x0f) != 3) &&
						((dat & 0x0f) < 7)) {
					opngen_keyon(&g_opngen, (dat & 0x0f) + 23, dat);
				}
			}
			else {
				fmtimer_setreg(addr, dat);
				if (addr == 0x27) {
					g_opngen.opnch[26].extop = dat & 0xc0;
				}
			}
		}
		else if (addr < 0xc0) {
			opngen_setreg(&g_opngen, 24, addr, dat);
		}
	}
	(void)port;
}
Ejemplo n.º 10
0
static void IOOUTCALL spb_o08a(UINT port, REG8 dat) {

	UINT	addr;

//	g_opn2.data1 = dat;
	addr = g_opn2.addr1l;
//	S98_put(NORMAL2608, addr, dat);
	g_opn2.reg[addr] = dat;
	if (addr < 0x10) {
		psggen_setreg(&g_psg2, addr, dat);
	}
	else {
		if (addr < 0x20) {
			rhythm_setreg(&g_rhythm2, addr, dat);
		}
		else if (addr < 0x30) {
			if (addr == 0x28) {
				if ((dat & 0x0f) < 3) {
					opngen_keyon(&g_opngen, (dat & 0x0f) + 12, dat);
				}
				else if (((dat & 0x0f) != 3) &&
						((dat & 0x0f) < 7)) {
					opngen_keyon(&g_opngen, (dat & 0x0f) + 11, dat);
				}
			}
			else {
				fmtimer_setreg(addr, dat);
				if (addr == 0x27) {
					g_opngen.opnch[14].extop = dat & 0xc0;
				}
			}
		}
		else if (addr < 0xc0) {
			opngen_setreg(&g_opngen, 12, addr, dat);
		}
	}
	(void)port;
}
Ejemplo n.º 11
0
/**
 * Writes register (Inner)
 * @param[in] opna The instance
 * @param[in] nAddress The address
 * @param[in] cData The data
 */
static void writeRegister(POPNA opna, UINT nAddress, REG8 cData)
{
	const UINT8 cCaps = opna->s.cCaps;
	CExternalOpna* pExt = reinterpret_cast<CExternalOpna*>(opna->userdata);

	if (nAddress < 0x10)
	{
		if (cCaps & OPNA_HAS_PSG)
		{
			keydisp_psg(opna->s.reg, nAddress);
			if ((!pExt) || (!pExt->HasPsg()))
			{
				psggen_setreg(&opna->psg, nAddress, cData);
			}
			else
			{
				pExt->WriteRegister(nAddress, cData);
			}
		}
	}
	else if (nAddress < 0x20)
	{
		if (cCaps & OPNA_HAS_RHYTHM)
		{
			if ((!pExt) || (!pExt->HasRhythm()))
			{
				rhythm_setreg(&opna->rhythm, nAddress, cData);
			}
			else
			{
				pExt->WriteRegister(nAddress, cData);
			}
		}
	}
	else if (nAddress < 0x30)
	{
		if (nAddress == 0x28)
		{
			REG8 cChannel = cData & 0x0f;
			if (cChannel < 8)
			{
				opna->s.keyreg[cChannel] = cData;
			}
			if (cChannel < 3)
			{
			}
			else if ((cCaps & OPNA_HAS_EXTENDEDFM) && (cChannel >= 4) && (cChannel < 7))
			{
				cChannel--;
			}
			else
			{
				return;
			}

			if (!pExt)
			{
				opngen_keyon(&opna->opngen, cChannel, cData);
			}
			else
			{
				pExt->WriteRegister(nAddress, cData);
			}
			keydisp_opnakeyon(opna->s.reg, cData);
		}
		else if (nAddress == 0x27)
		{
			if (cCaps & OPNA_HAS_TIMER)
			{
				opna_settimer(opna, cData);
			}

			if (pExt)
			{
				pExt->WriteRegister(nAddress, cData);
			}
			else
			{
				opna->opngen.opnch[2].extop = cData & 0xc0;
			}
		}
		else if (nAddress == 0x22)
		{
			if (pExt)
			{
				pExt->WriteRegister(nAddress, cData);
			}
		}
	}
	else if (nAddress < 0xc0)
	{
		if (!pExt)
		{
			opngen_setreg(&opna->opngen, 0, nAddress, cData);
		}
		else
		{
			pExt->WriteRegister(nAddress, cData);
		}
	}
}