summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/ymfm/src/ymfm_opn.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/ymfm/src/ymfm_opn.cpp')
-rw-r--r--3rdparty/ymfm/src/ymfm_opn.cpp29
1 files changed, 13 insertions, 16 deletions
diff --git a/3rdparty/ymfm/src/ymfm_opn.cpp b/3rdparty/ymfm/src/ymfm_opn.cpp
index 053ad97701c..9a8f5e99feb 100644
--- a/3rdparty/ymfm/src/ymfm_opn.cpp
+++ b/3rdparty/ymfm/src/ymfm_opn.cpp
@@ -143,26 +143,23 @@ bool opn_registers_base<IsOpnA>::write(uint16_t index, uint8_t data, uint32_t &c
assert(index < REGISTERS);
// writes in the 0xa0-af/0x1a0-af region are handled as latched pairs
- // borrow unused registers 0xb8-bf/0x1b8-bf as temporary holding locations
+ // borrow unused registers 0xb8-bf as temporary holding locations
if ((index & 0xf0) == 0xa0)
{
if (bitfield(index, 0, 2) == 3)
return false;
uint32_t latchindex = 0xb8 | bitfield(index, 3);
- if (IsOpnA)
- latchindex |= index & 0x100;
// writes to the upper half just latch (only low 6 bits matter)
if (bitfield(index, 2))
- m_regdata[latchindex] = data | 0x80;
+ m_regdata[latchindex] = data & 0x3f;
- // writes to the lower half only commit if the latch is there
- else if (bitfield(m_regdata[latchindex], 7))
+ // writes to the lower half also apply said latch
+ else
{
m_regdata[index] = data;
- m_regdata[index | 4] = m_regdata[latchindex] & 0x3f;
- m_regdata[latchindex] = 0;
+ m_regdata[index | 4] = m_regdata[latchindex];
}
return false;
}
@@ -409,9 +406,9 @@ std::string opn_registers_base<IsOpnA>::log_keyon(uint32_t choffs, uint32_t opof
}
char buffer[256];
- char *end = &buffer[0];
+ int end = 0;
- end += sprintf(end, "%u.%02u freq=%04X dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u freq=%04X dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X",
chnum, opnum,
block_freq,
op_detune(opoffs),
@@ -427,21 +424,21 @@ std::string opn_registers_base<IsOpnA>::log_keyon(uint32_t choffs, uint32_t opof
op_sustain_level(opoffs));
if (OUTPUTS > 1)
- end += sprintf(end, " out=%c%c",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " out=%c%c",
ch_output_0(choffs) ? 'L' : '-',
ch_output_1(choffs) ? 'R' : '-');
if (op_ssg_eg_enable(opoffs))
- end += sprintf(end, " ssg=%X", op_ssg_eg_mode(opoffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " ssg=%X", op_ssg_eg_mode(opoffs));
bool am = (op_lfo_am_enable(opoffs) && ch_lfo_am_sens(choffs) != 0);
if (am)
- end += sprintf(end, " am=%u", ch_lfo_am_sens(choffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u", ch_lfo_am_sens(choffs));
bool pm = (ch_lfo_pm_sens(choffs) != 0);
if (pm)
- end += sprintf(end, " pm=%u", ch_lfo_pm_sens(choffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u", ch_lfo_pm_sens(choffs));
if (am || pm)
- end += sprintf(end, " lfo=%02X", lfo_rate());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo=%02X", lfo_rate());
if (multi_freq() && choffs == 2)
- end += sprintf(end, " multi=1");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " multi=1");
return buffer;
}