aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/sound_adlib.cpp
diff options
context:
space:
mode:
authorJohannes Schickel2006-05-28 11:43:04 +0000
committerJohannes Schickel2006-05-28 11:43:04 +0000
commit727f66de391c8b0eab99f64602251ebbe4d2c2e3 (patch)
treeffb171bd8168830e2cb7e8586a3efa9ddb6049b2 /engines/kyra/sound_adlib.cpp
parent073f859de9d33d32350814fc414b7750c5555517 (diff)
downloadscummvm-rg350-727f66de391c8b0eab99f64602251ebbe4d2c2e3.tar.gz
scummvm-rg350-727f66de391c8b0eab99f64602251ebbe4d2c2e3.tar.bz2
scummvm-rg350-727f66de391c8b0eab99f64602251ebbe4d2c2e3.zip
Commits Chriliths patch for fixing Kyra on PalmOS.
svn-id: r22708
Diffstat (limited to 'engines/kyra/sound_adlib.cpp')
-rw-r--r--engines/kyra/sound_adlib.cpp295
1 files changed, 154 insertions, 141 deletions
diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp
index aa5bbde0ee..e4406d5453 100644
--- a/engines/kyra/sound_adlib.cpp
+++ b/engines/kyra/sound_adlib.cpp
@@ -81,8 +81,9 @@ private:
const char *name;
};
- static const OpcodeEntry _opcodeList[];
- static const int _opcodesEntries;
+ void setupOpcodeList();
+ const OpcodeEntry *_opcodeList;
+ int _opcodesEntries;
int snd_ret0x100(va_list &list);
int snd_ret0x1983(va_list &list);
@@ -228,8 +229,10 @@ private:
POpcode function;
const char *name;
};
- static const ParserOpcode _parserOpcodeTable[];
- static const int _parserOpcodeTableSize;
+
+ void setupParserOpcodeTable();
+ const ParserOpcode *_parserOpcodeTable;
+ int _parserOpcodeTableSize;
int update_setRepeat(uint8 *&dataptr, Channel &channel, uint8 value);
int update_checkRepeat(uint8 *&dataptr, Channel &channel, uint8 value);
@@ -384,6 +387,9 @@ private:
};
AdlibDriver::AdlibDriver(Audio::Mixer *mixer) {
+ setupOpcodeList();
+ setupParserOpcodeTable();
+
_mixer = mixer;
_flags = 0;
@@ -1811,146 +1817,154 @@ int AdlibDriver::updateCallback56(uint8 *&dataptr, Channel &channel, uint8 value
// static res
#define COMMAND(x) { &AdlibDriver::x, #x }
-const AdlibDriver::OpcodeEntry AdlibDriver::_opcodeList[] = {
- COMMAND(snd_ret0x100),
- COMMAND(snd_ret0x1983),
- COMMAND(snd_initDriver),
- COMMAND(snd_deinitDriver),
- COMMAND(snd_setSoundData),
- COMMAND(snd_unkOpcode1),
- COMMAND(snd_startSong),
- COMMAND(snd_unkOpcode2),
- COMMAND(snd_unkOpcode3),
- COMMAND(snd_readByte),
- COMMAND(snd_writeByte),
- COMMAND(snd_getSoundTrigger),
- COMMAND(snd_unkOpcode4),
- COMMAND(snd_dummy),
- COMMAND(snd_getNullvar4),
- COMMAND(snd_setNullvar3),
- COMMAND(snd_setFlag),
- COMMAND(snd_clearFlag)
-};
-
-const AdlibDriver::ParserOpcode AdlibDriver::_parserOpcodeTable[] = {
- // 0
- COMMAND(update_setRepeat),
- COMMAND(update_checkRepeat),
- COMMAND(update_setupProgram),
- COMMAND(update_setNoteSpacing),
-
- // 4
- COMMAND(update_jump),
- COMMAND(update_jumpToSubroutine),
- COMMAND(update_returnFromSubroutine),
- COMMAND(update_setBaseOctave),
-
- // 8
- COMMAND(update_stopChannel),
- COMMAND(update_playRest),
- COMMAND(update_writeAdlib),
- COMMAND(update_setupNoteAndDuration),
- // 12
- COMMAND(update_setBaseNote),
- COMMAND(update_setupSecondaryEffect1),
- COMMAND(update_stopOtherChannel),
- COMMAND(update_waitForEndOfProgram),
-
- // 16
- COMMAND(update_setupInstrument),
- COMMAND(update_setupPrimaryEffect1),
- COMMAND(update_removePrimaryEffect1),
- COMMAND(update_setBaseFreq),
-
- // 20
- COMMAND(update_stopChannel),
- COMMAND(update_setupPrimaryEffect2),
- COMMAND(update_stopChannel),
- COMMAND(update_stopChannel),
-
- // 24
- COMMAND(update_stopChannel),
- COMMAND(update_stopChannel),
- COMMAND(update_setPriority),
- COMMAND(update_stopChannel),
-
- // 28
- COMMAND(updateCallback23),
- COMMAND(updateCallback24),
- COMMAND(update_setExtraLevel1),
- COMMAND(update_stopChannel),
-
- // 32
- COMMAND(update_setupDuration),
- COMMAND(update_playNote),
- COMMAND(update_stopChannel),
- COMMAND(update_stopChannel),
-
- // 36
- COMMAND(update_setFractionalNoteSpacing),
- COMMAND(update_stopChannel),
- COMMAND(update_setTempo),
- COMMAND(update_removeSecondaryEffect1),
-
- // 40
- COMMAND(update_stopChannel),
- COMMAND(update_setChannelTempo),
- COMMAND(update_stopChannel),
- COMMAND(update_setExtraLevel3),
-
- // 44
- COMMAND(update_setExtraLevel2),
- COMMAND(update_changeExtraLevel2),
- COMMAND(update_setAMDepth),
- COMMAND(update_setVibratoDepth),
-
- // 48
- COMMAND(update_changeExtraLevel1),
- COMMAND(update_stopChannel),
- COMMAND(update_stopChannel),
- COMMAND(updateCallback38),
-
- // 52
- COMMAND(update_stopChannel),
- COMMAND(updateCallback39),
- COMMAND(update_removePrimaryEffect2),
- COMMAND(update_stopChannel),
-
- // 56
- COMMAND(update_stopChannel),
- COMMAND(updateCallback41),
- COMMAND(update_resetToGlobalTempo),
- COMMAND(update_nop1),
-
- // 60
- COMMAND(update_setDurationRandomness),
- COMMAND(update_changeChannelTempo),
- COMMAND(update_stopChannel),
- COMMAND(updateCallback46),
-
- // 64
- COMMAND(update_nop2),
- COMMAND(update_setupRhythmSection),
- COMMAND(update_playRhythmSection),
- COMMAND(update_removeRhythmSection),
-
- // 68
- COMMAND(updateCallback51),
- COMMAND(updateCallback52),
- COMMAND(updateCallback53),
- COMMAND(update_setSoundTrigger),
-
- // 72
- COMMAND(update_setTempoReset),
- COMMAND(updateCallback56),
- COMMAND(update_stopChannel)
+void AdlibDriver::setupOpcodeList() {
+ static const OpcodeEntry opcodeList[] = {
+ COMMAND(snd_ret0x100),
+ COMMAND(snd_ret0x1983),
+ COMMAND(snd_initDriver),
+ COMMAND(snd_deinitDriver),
+ COMMAND(snd_setSoundData),
+ COMMAND(snd_unkOpcode1),
+ COMMAND(snd_startSong),
+ COMMAND(snd_unkOpcode2),
+ COMMAND(snd_unkOpcode3),
+ COMMAND(snd_readByte),
+ COMMAND(snd_writeByte),
+ COMMAND(snd_getSoundTrigger),
+ COMMAND(snd_unkOpcode4),
+ COMMAND(snd_dummy),
+ COMMAND(snd_getNullvar4),
+ COMMAND(snd_setNullvar3),
+ COMMAND(snd_setFlag),
+ COMMAND(snd_clearFlag)
+ };
+
+ _opcodeList = opcodeList;
+ _opcodesEntries = ARRAYSIZE(opcodeList);
+}
+
+void AdlibDriver::setupParserOpcodeTable() {
+ static const ParserOpcode parserOpcodeTable[] = {
+ // 0
+ COMMAND(update_setRepeat),
+ COMMAND(update_checkRepeat),
+ COMMAND(update_setupProgram),
+ COMMAND(update_setNoteSpacing),
+
+ // 4
+ COMMAND(update_jump),
+ COMMAND(update_jumpToSubroutine),
+ COMMAND(update_returnFromSubroutine),
+ COMMAND(update_setBaseOctave),
+
+ // 8
+ COMMAND(update_stopChannel),
+ COMMAND(update_playRest),
+ COMMAND(update_writeAdlib),
+ COMMAND(update_setupNoteAndDuration),
+
+ // 12
+ COMMAND(update_setBaseNote),
+ COMMAND(update_setupSecondaryEffect1),
+ COMMAND(update_stopOtherChannel),
+ COMMAND(update_waitForEndOfProgram),
+
+ // 16
+ COMMAND(update_setupInstrument),
+ COMMAND(update_setupPrimaryEffect1),
+ COMMAND(update_removePrimaryEffect1),
+ COMMAND(update_setBaseFreq),
+
+ // 20
+ COMMAND(update_stopChannel),
+ COMMAND(update_setupPrimaryEffect2),
+ COMMAND(update_stopChannel),
+ COMMAND(update_stopChannel),
+
+ // 24
+ COMMAND(update_stopChannel),
+ COMMAND(update_stopChannel),
+ COMMAND(update_setPriority),
+ COMMAND(update_stopChannel),
+
+ // 28
+ COMMAND(updateCallback23),
+ COMMAND(updateCallback24),
+ COMMAND(update_setExtraLevel1),
+ COMMAND(update_stopChannel),
+
+ // 32
+ COMMAND(update_setupDuration),
+ COMMAND(update_playNote),
+ COMMAND(update_stopChannel),
+ COMMAND(update_stopChannel),
+
+ // 36
+ COMMAND(update_setFractionalNoteSpacing),
+ COMMAND(update_stopChannel),
+ COMMAND(update_setTempo),
+ COMMAND(update_removeSecondaryEffect1),
+
+ // 40
+ COMMAND(update_stopChannel),
+ COMMAND(update_setChannelTempo),
+ COMMAND(update_stopChannel),
+ COMMAND(update_setExtraLevel3),
+
+ // 44
+ COMMAND(update_setExtraLevel2),
+ COMMAND(update_changeExtraLevel2),
+ COMMAND(update_setAMDepth),
+ COMMAND(update_setVibratoDepth),
+
+ // 48
+ COMMAND(update_changeExtraLevel1),
+ COMMAND(update_stopChannel),
+ COMMAND(update_stopChannel),
+ COMMAND(updateCallback38),
+
+ // 52
+ COMMAND(update_stopChannel),
+ COMMAND(updateCallback39),
+ COMMAND(update_removePrimaryEffect2),
+ COMMAND(update_stopChannel),
+
+ // 56
+ COMMAND(update_stopChannel),
+ COMMAND(updateCallback41),
+ COMMAND(update_resetToGlobalTempo),
+ COMMAND(update_nop1),
+
+ // 60
+ COMMAND(update_setDurationRandomness),
+ COMMAND(update_changeChannelTempo),
+ COMMAND(update_stopChannel),
+ COMMAND(updateCallback46),
+
+ // 64
+ COMMAND(update_nop2),
+ COMMAND(update_setupRhythmSection),
+ COMMAND(update_playRhythmSection),
+ COMMAND(update_removeRhythmSection),
+
+ // 68
+ COMMAND(updateCallback51),
+ COMMAND(updateCallback52),
+ COMMAND(updateCallback53),
+ COMMAND(update_setSoundTrigger),
+
+ // 72
+ COMMAND(update_setTempoReset),
+ COMMAND(updateCallback56),
+ COMMAND(update_stopChannel)
+ };
+
+ _parserOpcodeTable = parserOpcodeTable;
+ _parserOpcodeTableSize = ARRAYSIZE(parserOpcodeTable);
};
#undef COMMAND
-const int AdlibDriver::_opcodesEntries = ARRAYSIZE(AdlibDriver::_opcodeList);
-const int AdlibDriver::_parserOpcodeTableSize = ARRAYSIZE(AdlibDriver::_parserOpcodeTable);
-
// This table holds the register offset for operator 1 for each of the nine
// channels. To get the register offset for operator 2, simply add 3.
@@ -2294,4 +2308,3 @@ void SoundAdlibPC::unk2() {
}
} // end of namespace Kyra
-