ff7_world_engine.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #pragma once
  2. #include "decompiler/decompiler_engine.h"
  3. #include <string>
  4. #include <vector>
  5. namespace FF7
  6. {
  7. class FF7WorldEngine : public Engine
  8. {
  9. public:
  10. FF7WorldEngine(int scriptNumber)
  11. : mScriptNumber(scriptNumber)
  12. {
  13. setOutputStackEffect(true);
  14. }
  15. std::unique_ptr<Disassembler> GetDisassembler(InstVec &insts) override;
  16. std::unique_ptr<CodeGenerator> GetCodeGenerator(const InstVec& insts, std::ostream &output) override;
  17. virtual void PostCFG(InstVec &insts, Graph g) override;
  18. virtual void getVariants(std::vector<std::string> &variants) const override;
  19. virtual bool UsePureGrouping() const override { return false; }
  20. std::vector<std::string> _textStrings; ///< Container for strings from the TEXT chunk.
  21. private:
  22. int mScriptNumber;
  23. };
  24. class FF7WorldLoadBankInstruction : public LoadInstruction
  25. {
  26. public:
  27. virtual void ProcessInst(Function& func, ValueStack &stack, Engine *engine, CodeGenerator *codeGen) override;
  28. };
  29. class BankValue : public VarValue
  30. {
  31. public:
  32. BankValue(std::string varName) : VarValue(varName) { }
  33. };
  34. class FF7WorldLoadInstruction : public LoadInstruction
  35. {
  36. public:
  37. virtual void ProcessInst(Function& func, ValueStack &stack, Engine *engine, CodeGenerator *codeGen) override;
  38. };
  39. class FF7SubStackInstruction : public StackInstruction
  40. {
  41. public:
  42. virtual void ProcessInst(Function& func, ValueStack &stack, Engine *engine, CodeGenerator *codeGen) override;
  43. };
  44. class BinaryEqualStackInstruction : public BinaryOpStackInstruction
  45. {
  46. public:
  47. virtual void ProcessInst(Function& func, ValueStack &stack, Engine *engine, CodeGenerator *codeGen) override
  48. {
  49. _codeGenData = "==";
  50. BinaryOpStackInstruction::ProcessInst(func, stack, engine, codeGen);
  51. }
  52. };
  53. class FF7WorldStoreInstruction : public StoreInstruction
  54. {
  55. public:
  56. virtual void ProcessInst(Function& func, ValueStack &stack, Engine *engine, CodeGenerator *codeGen) override;
  57. };
  58. class FF7WorldStackInstruction : public StackInstruction
  59. {
  60. public:
  61. virtual void ProcessInst(Function& func, ValueStack &stack, Engine *engine, CodeGenerator *codeGen) override;
  62. };
  63. class FF7WorldCondJumpInstruction : public CondJumpInstruction
  64. {
  65. public:
  66. virtual void ProcessInst(Function& func, ValueStack &stack, Engine *engine, CodeGenerator *codeGen) override;
  67. virtual uint32 GetDestAddress() const;
  68. virtual std::ostream& print(std::ostream &output) const override;
  69. };
  70. class FF7WorldUncondJumpInstruction : public UncondJumpInstruction
  71. {
  72. public:
  73. bool _isCall; ///< Whether or not this is really a call to a script function.
  74. FF7WorldUncondJumpInstruction() : _isCall(false) { }
  75. virtual bool IsFuncCall() const;
  76. virtual bool IsUncondJump() const;
  77. virtual uint32 GetDestAddress() const;
  78. virtual void ProcessInst(Function& func, ValueStack &stack, Engine *engine, CodeGenerator *codeGen) override;
  79. virtual std::ostream& print(std::ostream &output) const override;
  80. };
  81. class FF7WorldKernelCallInstruction : public KernelCallInstruction
  82. {
  83. public:
  84. virtual void ProcessInst(Function& func, ValueStack &stack, Engine *engine, CodeGenerator *codeGen) override;
  85. };
  86. class FF7WorldNoOutputInstruction : public Instruction
  87. {
  88. public:
  89. virtual void ProcessInst(Function& func, ValueStack &stack, Engine *engine, CodeGenerator *codeGen) override;
  90. };
  91. }