Split the opcodes into separate functions, and use an array of function
pointers for decoding them, like we do in most other engines. And I just want to say that this is the second biggest opcode table I've ever seen! svn-id: r21644
This commit is contained in:
parent
52d1d9ab8e
commit
1fa1f9520d
3 changed files with 1693 additions and 1181 deletions
File diff suppressed because it is too large
Load diff
|
@ -483,6 +483,8 @@ int SimonEngine::init(GameDetector &detector) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
setupOpcodes();
|
||||
|
||||
if (getGameType() == GType_FF) {
|
||||
_screenWidth = 640;
|
||||
_screenHeight = 480;
|
||||
|
|
|
@ -143,6 +143,11 @@ class SimonEngine : public Engine {
|
|||
|
||||
void errorString(const char *buf_input, char *buf_output);
|
||||
|
||||
typedef void (SimonEngine::*OpcodeProc) (bool &cond, int &ret);
|
||||
void setupOpcodes();
|
||||
const OpcodeProc *_opcode_table;
|
||||
int _numOpcodes;
|
||||
|
||||
typedef void (SimonEngine::*VgaOpcodeProc) ();
|
||||
void setupVgaOpcodes();
|
||||
const VgaOpcodeProc *_vga_opcode_table;
|
||||
|
@ -799,6 +804,181 @@ public:
|
|||
void vc83_playSoundLoop();
|
||||
void vc84_stopSoundLoop();
|
||||
|
||||
// Opcodes, Simon 1 and later
|
||||
void o1_at(bool &cond, int &ret);
|
||||
void o1_notAt(bool &cond, int &ret);
|
||||
void o1_carried(bool &cond, int &ret);
|
||||
void o1_notCarried(bool &cond, int &ret);
|
||||
void o1_isAt(bool &cond, int &ret);
|
||||
void o1_zero(bool &cond, int &ret);
|
||||
void o1_notZero(bool &cond, int &ret);
|
||||
void o1_eq(bool &cond, int &ret);
|
||||
void o1_notEq(bool &cond, int &ret);
|
||||
void o1_gt(bool &cond, int &ret);
|
||||
void o1_lt(bool &cond, int &ret);
|
||||
void o1_eqf(bool &cond, int &ret);
|
||||
void o1_notEqf(bool &cond, int &ret);
|
||||
void o1_ltf(bool &cond, int &ret);
|
||||
void o1_gtf(bool &cond, int &ret);
|
||||
void o1_chance(bool &cond, int &ret);
|
||||
void o1_isRoom(bool &cond, int &ret);
|
||||
void o1_isObject(bool &cond, int &ret);
|
||||
void o1_state(bool &cond, int &ret);
|
||||
void o1_oflag(bool &cond, int &ret);
|
||||
void o1_destroy(bool &cond, int &ret);
|
||||
void o1_place(bool &cond, int &ret);
|
||||
void o1_copyff(bool &cond, int &ret);
|
||||
void o1_clear(bool &cond, int &ret);
|
||||
void o1_let(bool &cond, int &ret);
|
||||
void o1_add(bool &cond, int &ret);
|
||||
void o1_sub(bool &cond, int &ret);
|
||||
void o1_addf(bool &cond, int &ret);
|
||||
void o1_subf(bool &cond, int &ret);
|
||||
void o1_mul(bool &cond, int &ret);
|
||||
void o1_div(bool &cond, int &ret);
|
||||
void o1_mulf(bool &cond, int &ret);
|
||||
void o1_divf(bool &cond, int &ret);
|
||||
void o1_mod(bool &cond, int &ret);
|
||||
void o1_modf(bool &cond, int &ret);
|
||||
void o1_random(bool &cond, int &ret);
|
||||
void o1_goto(bool &cond, int &ret);
|
||||
void o1_oset(bool &cond, int &ret);
|
||||
void o1_oclear(bool &cond, int &ret);
|
||||
void o1_putBy(bool &cond, int &ret);
|
||||
void o1_inc(bool &cond, int &ret);
|
||||
void o1_dec(bool &cond, int &ret);
|
||||
void o1_setState(bool &cond, int &ret);
|
||||
void o1_print(bool &cond, int &ret);
|
||||
void o1_message(bool &cond, int &ret);
|
||||
void o1_msg(bool &cond, int &ret);
|
||||
void o1_addTextBox(bool &cond, int &ret);
|
||||
void o1_setShortText(bool &cond, int &ret);
|
||||
void o1_setLongText(bool &cond, int &ret);
|
||||
void o1_end(bool &cond, int &ret);
|
||||
void o1_done(bool &cond, int &ret);
|
||||
void o1_printLongText(bool &cond, int &ret);
|
||||
void o1_process(bool &cond, int &ret);
|
||||
void o1_when(bool &cond, int &ret);
|
||||
void o1_if1(bool &cond, int &ret);
|
||||
void o1_if2(bool &cond, int &ret);
|
||||
void o1_isCalled(bool &cond, int &ret);
|
||||
void o1_is(bool &cond, int &ret);
|
||||
void o1_debug(bool &cond, int &ret);
|
||||
void o1_rescan(bool &cond, int &ret);
|
||||
void o1_comment(bool &cond, int &ret);
|
||||
void o1_haltAnimation(bool &cond, int &ret);
|
||||
void o1_restartAnimation(bool &cond, int &ret);
|
||||
void o1_getParent(bool &cond, int &ret);
|
||||
void o1_getNext(bool &cond, int &ret);
|
||||
void o1_getChildren(bool &cond, int &ret);
|
||||
void o1_picture(bool &cond, int &ret);
|
||||
void o1_loadZone(bool &cond, int &ret);
|
||||
void o1_animate(bool &cond, int &ret);
|
||||
void o1_stopAnimate(bool &cond, int &ret);
|
||||
void o1_killAnimate(bool &cond, int &ret);
|
||||
void o1_defWindow(bool &cond, int &ret);
|
||||
void o1_window(bool &cond, int &ret);
|
||||
void o1_cls(bool &cond, int &ret);
|
||||
void o1_closeWindow(bool &cond, int &ret);
|
||||
void o1_addBox(bool &cond, int &ret);
|
||||
void o1_delBox(bool &cond, int &ret);
|
||||
void o1_enableBox(bool &cond, int &ret);
|
||||
void o1_disableBox(bool &cond, int &ret);
|
||||
void o1_moveBox(bool &cond, int &ret);
|
||||
void o1_doIcons(bool &cond, int &ret);
|
||||
void o1_isClass(bool &cond, int &ret);
|
||||
void o1_setClass(bool &cond, int &ret);
|
||||
void o1_unsetClass(bool &cond, int &ret);
|
||||
void o1_waitSync(bool &cond, int &ret);
|
||||
void o1_sync(bool &cond, int &ret);
|
||||
void o1_defObj(bool &cond, int &ret);
|
||||
void o1_here(bool &cond, int &ret);
|
||||
void o1_doClassIcons(bool &cond, int &ret);
|
||||
void o1_playTune(bool &cond, int &ret);
|
||||
void o1_waitEndTune(bool &cond, int &ret);
|
||||
void o1_ifEndTune(bool &cond, int &ret);
|
||||
void o1_setAdjNoun(bool &cond, int &ret);
|
||||
void o1_saveUserGame(bool &cond, int &ret);
|
||||
void o1_loadUserGame(bool &cond, int &ret);
|
||||
void o1_stopTune(bool &cond, int &ret);
|
||||
void o1_pauseGame(bool &cond, int &ret);
|
||||
void o1_copysf(bool &cond, int &ret);
|
||||
void o1_restoreIcons(bool &cond, int &ret);
|
||||
void o1_freezeZones(bool &cond, int &ret);
|
||||
void o1_placeNoIcons(bool &cond, int &ret);
|
||||
void o1_clearTimers(bool &cond, int &ret);
|
||||
void o1_setDollar(bool &cond, int &ret);
|
||||
void o1_isBox(bool &cond, int &ret);
|
||||
void o1_doTable(bool &cond, int &ret);
|
||||
void o1_storeItem(bool &cond, int &ret);
|
||||
void o1_getItem(bool &cond, int &ret);
|
||||
void o1_bSet(bool &cond, int &ret);
|
||||
void o1_bClear(bool &cond, int &ret);
|
||||
void o1_bZero(bool &cond, int &ret);
|
||||
void o1_bNotZero(bool &cond, int &ret);
|
||||
void o1_getOValue(bool &cond, int &ret);
|
||||
void o1_setOValue(bool &cond, int &ret);
|
||||
void o1_ink(bool &cond, int &ret);
|
||||
void o1_screenTextBox(bool &cond, int &ret);
|
||||
void o1_screenTextMsg(bool &cond, int &ret);
|
||||
void o1_playEffect(bool &cond, int &ret);
|
||||
void o1_getDollar2(bool &cond, int &ret);
|
||||
void o1_isAdjNoun(bool &cond, int &ret);
|
||||
void o1_b2Set(bool &cond, int &ret);
|
||||
void o1_b2Clear(bool &cond, int &ret);
|
||||
void o1_b2Zero(bool &cond, int &ret);
|
||||
void o1_b2NotZero(bool &cond, int &ret);
|
||||
void o1_lockZones(bool &cond, int &ret);
|
||||
void o1_unlockZones(bool &cond, int &ret);
|
||||
void o1_screenTextPObj(bool &cond, int &ret);
|
||||
void o1_getPathPosn(bool &cond, int &ret);
|
||||
void o1_scnTxtLongText(bool &cond, int &ret);
|
||||
void o1_mouseOn(bool &cond, int &ret);
|
||||
void o1_mouseOff(bool &cond, int &ret);
|
||||
void o1_loadBeard(bool &cond, int &ret);
|
||||
void o1_unloadBeard(bool &cond, int &ret);
|
||||
void o1_unloadZone(bool &cond, int &ret);
|
||||
void o1_loadStrings(bool &cond, int &ret);
|
||||
void o1_unfreezeZones(bool &cond, int &ret);
|
||||
void o1_specialFade(bool &cond, int &ret);
|
||||
|
||||
// Opcodes, Simon 2 and later
|
||||
void o2_printLongText(bool &cond, int &ret);
|
||||
void o2_rescan(bool &cond, int &ret);
|
||||
void o2_animate(bool &cond, int &ret);
|
||||
void o2_stopAnimate(bool &cond, int &ret);
|
||||
void o2_mouseOff(bool &cond, int &ret);
|
||||
void o2_isShortText(bool &cond, int &ret);
|
||||
void o2_clearMarks(bool &cond, int &ret);
|
||||
void o2_waitMark(bool &cond, int &ret);
|
||||
|
||||
// Opcodes, Feeble Files
|
||||
void o3_jumpOut(bool &cond, int &ret);
|
||||
void o3_printLongText(bool &cond, int &ret);
|
||||
void o3_oracleTextDown(bool &cond, int &ret);
|
||||
void o3_oracleTextUp(bool &cond, int &ret);
|
||||
void o3_ifTime(bool &cond, int &ret);
|
||||
void o3_setTime(bool &cond, int &ret);
|
||||
void o3_loadUserGame(bool &cond, int &ret);
|
||||
void o3_listSaveGames(bool &cond, int &ret);
|
||||
void o3_checkCD(bool &cond, int &ret);
|
||||
void o3_screenTextBox(bool &cond, int &ret);
|
||||
void o3_hyperLinkOn(bool &cond, int &ret);
|
||||
void o3_hyperLinkOff(bool &cond, int &ret);
|
||||
void o3_checkPaths(bool &cond, int &ret);
|
||||
void o3_loadSmack(bool &cond, int &ret);
|
||||
void o3_playSmack(bool &cond, int &ret);
|
||||
void o3_centreScroll(bool &cond, int &ret);
|
||||
void o3_resetPVCount(bool &cond, int &ret);
|
||||
void o3_setPathValues(bool &cond, int &ret);
|
||||
void o3_stopClock(bool &cond, int &ret);
|
||||
void o3_restartClock(bool &cond, int &ret);
|
||||
void o3_setColour(bool &cond, int &ret);
|
||||
void o3_b3Set(bool &cond, int &ret);
|
||||
void o3_b3Clear(bool &cond, int &ret);
|
||||
void o3_b3Zero(bool &cond, int &ret);
|
||||
void o3_b3NotZero(bool &cond, int &ret);
|
||||
|
||||
protected:
|
||||
void drawImages(VC10_state *state);
|
||||
void drawImages_Feeble(VC10_state *state);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue