diff options
author | Torbjörn Andersson | 2006-03-01 08:06:54 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2006-03-01 08:06:54 +0000 |
commit | 272a19cf5bdb722507b72a1ce380f64dbc974963 (patch) | |
tree | c1915d7bdfd275550cbeddd0b932b6ff82880f28 /engines/kyra | |
parent | 3a38721d028a2a2e738fb806fc22fc36863a0a3d (diff) | |
download | scummvm-rg350-272a19cf5bdb722507b72a1ce380f64dbc974963.tar.gz scummvm-rg350-272a19cf5bdb722507b72a1ce380f64dbc974963.tar.bz2 scummvm-rg350-272a19cf5bdb722507b72a1ce380f64dbc974963.zip |
Use signed integers for jump offsets, so that the jump opcodes can jump both
forward and backward. This seems to fix the looping of the Black forest music
(and probably others as well), and might fix the invalid pointer crashes and
wrong music that would sometimes play after a song had finished. Changed the
names of the jump opcode functions, and added "update_" prefixes to the
previously cleaned-up opcode functions.
svn-id: r20986
Diffstat (limited to 'engines/kyra')
-rw-r--r-- | engines/kyra/sound_adlib.cpp | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp index 640b2549f8..14e37ec914 100644 --- a/engines/kyra/sound_adlib.cpp +++ b/engines/kyra/sound_adlib.cpp @@ -185,13 +185,13 @@ private: static const ParserOpcode _parserOpcodeTable[]; static const int _parserOpcodeTableSize; - int updateCallback1(uint8 *&dataptr, OutputState &state, uint8 value); - int updateCallback2(uint8 *&dataptr, OutputState &state, uint8 value); + int update_setRepeat(uint8 *&dataptr, OutputState &state, uint8 value); + int update_checkRepeat(uint8 *&dataptr, OutputState &state, uint8 value); int updateCallback3(uint8 *&dataptr, OutputState &state, uint8 value); int updateCallback4(uint8 *&dataptr, OutputState &state, uint8 value); - int updateCallback5(uint8 *&dataptr, OutputState &state, uint8 value); - int updateCallbackPushDataPtr(uint8 *&dataptr, OutputState &state, uint8 value); - int updateCallbackPopDataPtr(uint8 *&dataptr, OutputState &state, uint8 value); + int update_jump(uint8 *&dataptr, OutputState &state, uint8 value); + int update_jumpToSubroutine(uint8 *&dataptr, OutputState &state, uint8 value); + int update_returnFromSubroutine(uint8 *&dataptr, OutputState &state, uint8 value); int updateCallback8(uint8 *&dataptr, OutputState &state, uint8 value); int updateCallback9(uint8 *&dataptr, OutputState &state, uint8 value); int updateCallback10(uint8 *&dataptr, OutputState &state, uint8 value); @@ -219,8 +219,8 @@ private: int updateCallback32(uint8 *&dataptr, OutputState &state, uint8 value); int updateCallback33(uint8 *&dataptr, OutputState &state, uint8 value); int updateCallback34(uint8 *&dataptr, OutputState &state, uint8 value); - int setAMDepth(uint8 *&dataptr, OutputState &state, uint8 value); - int setVibratoDepth(uint8 *&dataptr, OutputState &state, uint8 value); + int update_setAMDepth(uint8 *&dataptr, OutputState &state, uint8 value); + int update_setVibratoDepth(uint8 *&dataptr, OutputState &state, uint8 value); int updateCallback37(uint8 *&dataptr, OutputState &state, uint8 value); int updateCallback38(uint8 *&dataptr, OutputState &state, uint8 value); int updateCallback39(uint8 *&dataptr, OutputState &state, uint8 value); @@ -935,18 +935,15 @@ uint8 AdlibDriver::calculateLowByte2(OutputState &state) { // parser opcodes -int AdlibDriver::updateCallback1(uint8 *&dataptr, OutputState &state, uint8 value) { +int AdlibDriver::update_setRepeat(uint8 *&dataptr, OutputState &state, uint8 value) { state.unk9 = value; return 0; } -int AdlibDriver::updateCallback2(uint8 *&dataptr, OutputState &state, uint8 value) { +int AdlibDriver::update_checkRepeat(uint8 *&dataptr, OutputState &state, uint8 value) { ++dataptr; if (--state.unk9) { - --dataptr; - --dataptr; - uint16 add = READ_LE_UINT16(dataptr); - dataptr += 2; + int16 add = READ_LE_UINT16(dataptr - 2); dataptr += add; } return 0; @@ -980,22 +977,22 @@ int AdlibDriver::updateCallback4(uint8 *&dataptr, OutputState &state, uint8 valu return 0; } -int AdlibDriver::updateCallback5(uint8 *&dataptr, OutputState &state, uint8 value) { +int AdlibDriver::update_jump(uint8 *&dataptr, OutputState &state, uint8 value) { --dataptr; - uint16 add = READ_LE_UINT16(dataptr); dataptr += 2; + int16 add = READ_LE_UINT16(dataptr); dataptr += 2; dataptr += add; return 0; } -int AdlibDriver::updateCallbackPushDataPtr(uint8 *&dataptr, OutputState &state, uint8 value) { +int AdlibDriver::update_jumpToSubroutine(uint8 *&dataptr, OutputState &state, uint8 value) { --dataptr; - uint16 add = READ_LE_UINT16(dataptr); dataptr += 2; + int16 add = READ_LE_UINT16(dataptr); dataptr += 2; state.dataptrStack[state.dataptrStackPos++] = dataptr; dataptr += add; return 0; } -int AdlibDriver::updateCallbackPopDataPtr(uint8 *&dataptr, OutputState &state, uint8 value) { +int AdlibDriver::update_returnFromSubroutine(uint8 *&dataptr, OutputState &state, uint8 value) { dataptr = state.dataptrStack[--state.dataptrStackPos]; return 0; } @@ -1201,7 +1198,7 @@ int AdlibDriver::updateCallback34(uint8 *&dataptr, OutputState &state, uint8 val return 0; } -int AdlibDriver::setAMDepth(uint8 *&dataptr, OutputState &state, uint8 value) { +int AdlibDriver::update_setAMDepth(uint8 *&dataptr, OutputState &state, uint8 value) { if (value & 1) _unkOutputByte2 |= 0x80; else @@ -1212,7 +1209,7 @@ int AdlibDriver::setAMDepth(uint8 *&dataptr, OutputState &state, uint8 value) { return 0; } -int AdlibDriver::setVibratoDepth(uint8 *&dataptr, OutputState &state, uint8 value) { +int AdlibDriver::update_setVibratoDepth(uint8 *&dataptr, OutputState &state, uint8 value) { if (value & 1) _unkOutputByte2 |= 0x40; else @@ -1674,15 +1671,15 @@ const AdlibDriver::OpcodeEntry AdlibDriver::_opcodeList[] = { const AdlibDriver::ParserOpcode AdlibDriver::_parserOpcodeTable[] = { // 0 - COMMAND(updateCallback1), - COMMAND(updateCallback2), + COMMAND(update_setRepeat), + COMMAND(update_checkRepeat), COMMAND(updateCallback3), COMMAND(updateCallback4), // 4 - COMMAND(updateCallback5), - COMMAND(updateCallbackPushDataPtr), - COMMAND(updateCallbackPopDataPtr), + COMMAND(update_jump), + COMMAND(update_jumpToSubroutine), + COMMAND(update_returnFromSubroutine), COMMAND(updateCallback8), // 8 @@ -1742,8 +1739,8 @@ const AdlibDriver::ParserOpcode AdlibDriver::_parserOpcodeTable[] = { // 44 COMMAND(updateCallback33), COMMAND(updateCallback34), - COMMAND(setAMDepth), - COMMAND(setVibratoDepth), + COMMAND(update_setAMDepth), + COMMAND(update_setVibratoDepth), // 48 COMMAND(updateCallback37), |