aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/kyra/sound_adlib.cpp90
1 files changed, 39 insertions, 51 deletions
diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp
index 3bb5e99f43..24299abdcb 100644
--- a/engines/kyra/sound_adlib.cpp
+++ b/engines/kyra/sound_adlib.cpp
@@ -204,11 +204,24 @@ private:
uint16 checkValue(int16 val) {
if (val < 0)
val = 0;
- if (val > 0x3F)
+ else if (val > 0x3F)
val = 0x3F;
return val;
}
+ // The sound data has at least two lookup tables:
+ //
+ // * One for programs, starting at offset 0.
+ // * One for instruments, starting at offset 500.
+
+ uint8 *getProgram(int progId) {
+ return _soundData + READ_LE_UINT16(_soundData + 2 * progId);
+ }
+
+ uint8 *getInstrument(int instrumentId) {
+ return _soundData + READ_LE_UINT16(_soundData + 500 + 2 * instrumentId);
+ }
+
void setupPrograms();
void executePrograms();
@@ -235,7 +248,7 @@ private:
int update_setBaseNote(uint8 *&dataptr, Channel &channel, uint8 value);
int update_setupSecondaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value);
int update_stopOtherChannel(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback16(uint8 *&dataptr, Channel &channel, uint8 value);
+ int update_waitForEndOfProgram(uint8 *&dataptr, Channel &channel, uint8 value);
int update_setupInstrument(uint8 *&dataptr, Channel &channel, uint8 value);
int update_setupPrimaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value);
int update_removePrimaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value);
@@ -468,11 +481,12 @@ int AdlibDriver::snd_startSong(va_list &list) {
int songId = va_arg(list, int);
_flags |= 8;
_flagTrigger = 1;
- uint16 offset = READ_LE_UINT16(&_soundData[songId << 1]);
- uint8 firstByte = *(_soundData + offset);
+
+ uint8 *ptr = getProgram(songId);
+ uint8 chan = *ptr;
if ((songId << 1) != 0) {
- if (firstByte == 9) {
+ if (chan == 9) {
if (_flags & 2)
return 0;
} else {
@@ -593,8 +607,7 @@ void AdlibDriver::callback() {
void AdlibDriver::setupPrograms() {
while (_lastProcessed != _soundsPlaying) {
- uint16 add = _soundIdTable[_lastProcessed] << 1;
- uint8 *ptr = _soundData + READ_LE_UINT16(_soundData + add);
+ uint8 *ptr = getProgram(_soundIdTable[_lastProcessed]);
uint8 chan = *ptr++;
uint8 priority = *ptr++;
@@ -1152,16 +1165,9 @@ uint8 AdlibDriver::calculateOpLevel1(Channel &channel) {
value += channel.opExtraLevel3;
}
- // Don't allow the total level to overflow into the scaling level bits.
-
- if (value > 0x3F) {
- value = 0x3F;
- } else if (value < 0)
- value = 0;
-
// Preserve the scaling level bits from opLevel1
- return value | (channel.opLevel1 & 0xC0);
+ return checkValue(value) | (channel.opLevel1 & 0xC0);
}
uint8 AdlibDriver::calculateOpLevel2(Channel &channel) {
@@ -1171,16 +1177,9 @@ uint8 AdlibDriver::calculateOpLevel2(Channel &channel) {
value += channel.opExtraLevel2;
value += channel.opExtraLevel3;
- // Don't allow the total level to overflow into the scaling level bits.
-
- if (value > 0x3F) {
- value = 0x3F;
- } else if (value < 0)
- value = 0;
-
// Preserve the scaling level bits from opLevel2
- return value | (channel.opLevel2 & 0xC0);
+ return checkValue(value) | (channel.opLevel2 & 0xC0);
}
// parser opcodes
@@ -1203,8 +1202,7 @@ int AdlibDriver::update_setupProgram(uint8 *&dataptr, Channel &channel, uint8 va
if (value == 0xFF)
return 0;
- uint16 add = value << 1;
- uint8 *ptr = _soundData + READ_LE_UINT16(_soundData + add);
+ uint8 *ptr = getProgram(value);
uint8 chan = *ptr++;
uint8 priority = *ptr++;
@@ -1304,21 +1302,20 @@ int AdlibDriver::update_stopOtherChannel(uint8 *&dataptr, Channel &channel, uint
return 0;
}
-int AdlibDriver::updateCallback16(uint8 *&dataptr, Channel &channel, uint8 value) {
- uint8 *ptr = _soundData;
- ptr += READ_LE_UINT16(&_soundData[value << 1]);
- Channel &channel2 = _channels[*ptr];
- if (!channel2.dataptr) {
+int AdlibDriver::update_waitForEndOfProgram(uint8 *&dataptr, Channel &channel, uint8 value) {
+ uint8 *ptr = getProgram(value);
+ uint8 chan = *ptr;
+
+ if (!_channels[chan].dataptr) {
return 0;
}
+
dataptr -= 2;
return 2;
}
int AdlibDriver::update_setupInstrument(uint8 *&dataptr, Channel &channel, uint8 value) {
- uint8 *ptr = _soundData;
- ptr += READ_LE_UINT16(_soundData + (value << 1) + 0x1F4);
- setupInstrument(_curRegOffset, ptr, channel);
+ setupInstrument(_curRegOffset, getInstrument(value), channel);
return 0;
}
@@ -1592,34 +1589,25 @@ int AdlibDriver::update_setupRhythmSection(uint8 *&dataptr, Channel &channel, ui
int channelBackUp = _curChannel;
int regOffsetBackUp = _curRegOffset;
- uint8 entry = value << 1;
- uint8 *ptr = _soundData + READ_LE_UINT16(_soundData + entry + 0x1F4);
-
_curChannel = 6;
_curRegOffset = _regOffset[6];
- _unkValue6 = *(ptr + 6);
- setupInstrument(_curRegOffset, ptr, channel);
-
- entry = *dataptr++ << 1;
- ptr = _soundData + READ_LE_UINT16(_soundData + entry + 0x1F4);
+ setupInstrument(_curRegOffset, getInstrument(value), channel);
+ _unkValue6 = channel.opLevel2;
_curChannel = 7;
_curRegOffset = _regOffset[7];
- _unkValue7 = entry = *(ptr + 5);
- _unkValue8 = entry = *(ptr + 6);
- setupInstrument(_curRegOffset, ptr, channel);
-
- entry = *dataptr++ << 1;
- ptr = _soundData + READ_LE_UINT16(_soundData + entry + 0x1F4);
+ setupInstrument(_curRegOffset, getInstrument(*dataptr++), channel);
+ _unkValue7 = channel.opLevel1;
+ _unkValue8 = channel.opLevel2;
_curChannel = 8;
_curRegOffset = _regOffset[8];
- _unkValue9 = entry = *(ptr + 5);
- _unkValue10 = entry = *(ptr + 6);
- setupInstrument(_curRegOffset, ptr, channel);
+ setupInstrument(_curRegOffset, getInstrument(*dataptr++), channel);
+ _unkValue9 = channel.opLevel1;
+ _unkValue10 = channel.opLevel2;
// Octave / F-Number / Key-On for channels 6, 7 and 8
@@ -1905,7 +1893,7 @@ const AdlibDriver::ParserOpcode AdlibDriver::_parserOpcodeTable[] = {
COMMAND(update_setBaseNote),
COMMAND(update_setupSecondaryEffect1),
COMMAND(update_stopOtherChannel),
- COMMAND(updateCallback16),
+ COMMAND(update_waitForEndOfProgram),
// 16
COMMAND(update_setupInstrument),