mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-09 12:22:51 +00:00
moved code for initialising patterns into own function
added initialisation of return-addresses for patterns and macros svn-id: r43045
This commit is contained in:
parent
0306695459
commit
e6f8bfafc7
@ -334,6 +334,7 @@ void Tfmx::macroRun(ChannelContext &channel) {
|
||||
channel.vibLength = macroPtr[1];
|
||||
channel.vibCount = macroPtr[1] / 2;
|
||||
channel.vibDelta = macroPtr[3];
|
||||
// TODO: Perhaps a bug, vibValue could be left uninitialised
|
||||
if (!channel.portaDelta) {
|
||||
channel.period = channel.refPeriod;
|
||||
channel.vibValue = 0;
|
||||
@ -358,7 +359,7 @@ void Tfmx::macroRun(ChannelContext &channel) {
|
||||
channel.envEndVolume = macroPtr[3];
|
||||
continue;
|
||||
|
||||
case 0x11: // Add Begin. Parameters: times, Offset(W)
|
||||
case 0x11: // Add Beginn. Parameters: times, Offset(W)
|
||||
channel.addBeginLength = channel.addBeginCount = macroPtr[1];
|
||||
channel.addBeginDelta = (int16)READ_BE_UINT16(¯oPtr[2]);
|
||||
channel.sampleStart += channel.addBeginDelta;
|
||||
@ -482,8 +483,10 @@ startPatterns:
|
||||
// issue all Steps for this tick
|
||||
if (patternRun(pattern)) {
|
||||
// we load the next Trackstep Command and then process all Channels again
|
||||
trackRun(true);
|
||||
goto startPatterns;
|
||||
if (trackRun(true))
|
||||
goto startPatterns;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
} else
|
||||
@ -493,7 +496,7 @@ startPatterns:
|
||||
pattern.command = 0xFF;
|
||||
ChannelContext &channel = _channelCtx[pattern.expose & (kNumVoices - 1)];
|
||||
if (!channel.sfxLocked) {
|
||||
clearMacroProgramm(channel);
|
||||
haltMacroProgramm(channel);
|
||||
Paula::disableChannel(channel.paulaChannel);
|
||||
}
|
||||
} // else this pattern-Channel is stopped
|
||||
@ -587,16 +590,8 @@ bool Tfmx::patternRun(PatternContext &pattern) {
|
||||
initFadeCommand((uint8)patternPtr[1], (int8)patternPtr[3]);
|
||||
continue;
|
||||
|
||||
case 11: { // play pattern. Parameters: patternCmd, channel, expose
|
||||
PatternContext &target = _patternCtx[patternPtr[2] & (kNumChannels - 1)];
|
||||
|
||||
target.command = patternPtr[1];
|
||||
target.offset = _resource->patternOffset[patternPtr[1] & (kMaxPatternOffsets - 1)];
|
||||
target.expose = patternPtr[3];
|
||||
target.step = 0;
|
||||
target.wait = 0;
|
||||
target.loopCount = 0xFF;
|
||||
}
|
||||
case 11: // play pattern. Parameters: patternCmd, channel, expose
|
||||
initPattern(_patternCtx[patternPtr[2] & (kNumChannels - 1)], patternPtr[1], patternPtr[3], _resource->patternOffset[patternPtr[1] & (kMaxPatternOffsets - 1)]);
|
||||
continue;
|
||||
|
||||
case 12: // Lock. Parameters: lockFlag, channel, lockTime
|
||||
@ -631,18 +626,16 @@ bool Tfmx::trackRun(const bool incStep) {
|
||||
if (trackData[0] != FROM_BE_16(0xEFFE)) {
|
||||
// 8 commands for Patterns
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
const uint patCmd = READ_BE_UINT16(&trackData[i]);
|
||||
const uint8 *patCmd = (const uint8 *)&trackData[i];
|
||||
// First byte is pattern number
|
||||
const uint patNum = (patCmd >> 8);
|
||||
const uint8 patNum = patCmd[0];
|
||||
// if highest bit is set then keep previous pattern
|
||||
if (patNum < 0x80) {
|
||||
_patternCtx[i].step = 0;
|
||||
_patternCtx[i].wait = 0;
|
||||
_patternCtx[i].loopCount = 0xFF;
|
||||
_patternCtx[i].offset = _resource->patternOffset[patNum];
|
||||
initPattern(_patternCtx[i], patNum, patCmd[1], _resource->patternOffset[patNum]);
|
||||
} else {
|
||||
_patternCtx[i].command = patNum;
|
||||
_patternCtx[i].expose = (int8)patCmd[1];
|
||||
}
|
||||
_patternCtx[i].command = (uint8)patNum;
|
||||
_patternCtx[i].expose = patCmd & 0xFF;
|
||||
}
|
||||
return true;
|
||||
|
||||
@ -938,7 +931,7 @@ void Tfmx::stopMacroEffect(int channel) {
|
||||
assert(0 <= channel && channel < kNumVoices);
|
||||
Common::StackLock lock(_mutex);
|
||||
unlockMacroChannel(_channelCtx[channel]);
|
||||
clearMacroProgramm(_channelCtx[channel]);
|
||||
haltMacroProgramm(_channelCtx[channel]);
|
||||
Paula::disableChannel(_channelCtx[channel].paulaChannel);
|
||||
}
|
||||
|
||||
|
@ -231,6 +231,9 @@ private:
|
||||
channel.macroLoopCount = 0xFF;
|
||||
channel.dmaIntCount = 0;
|
||||
channel.deferWait = false;
|
||||
|
||||
channel.macroReturnOffset = 0;
|
||||
channel.macroReturnStep = 0;
|
||||
}
|
||||
|
||||
static void clearEffects(ChannelContext &channel) {
|
||||
@ -240,7 +243,7 @@ private:
|
||||
channel.portaDelta = 0;
|
||||
}
|
||||
|
||||
static void clearMacroProgramm(ChannelContext &channel) {
|
||||
static void haltMacroProgramm(ChannelContext &channel) {
|
||||
channel.macroRun = false;
|
||||
channel.dmaIntCount = 0;
|
||||
}
|
||||
@ -252,6 +255,18 @@ private:
|
||||
channel.sfxLockTime = -1;
|
||||
}
|
||||
|
||||
static void initPattern(PatternContext &pattern, uint8 cmd, int8 expose, uint32 offset) {
|
||||
pattern.command = cmd;
|
||||
pattern.offset = offset;
|
||||
pattern.expose = expose;
|
||||
pattern.step = 0;
|
||||
pattern.wait = 0;
|
||||
pattern.loopCount = 0xFF;
|
||||
|
||||
pattern.savedOffset = 0;
|
||||
pattern.savedStep = 0;
|
||||
}
|
||||
|
||||
void stopPatternChannels() {
|
||||
for (int i = 0; i < kNumChannels; ++i) {
|
||||
_patternCtx[i].command = 0xFF;
|
||||
@ -263,7 +278,7 @@ private:
|
||||
for (int i = 0; i < kNumVoices; ++i) {
|
||||
clearEffects(_channelCtx[i]);
|
||||
unlockMacroChannel(_channelCtx[i]);
|
||||
clearMacroProgramm(_channelCtx[i]);
|
||||
haltMacroProgramm(_channelCtx[i]);
|
||||
_channelCtx[i].note = 0;
|
||||
_channelCtx[i].volume = 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user