diff options
-rw-r--r-- | devtools/tasmrecover/tasm/proc.py | 33 | ||||
-rw-r--r-- | engines/dreamweb/dreamgen.cpp | 3 | ||||
-rw-r--r-- | engines/dreamweb/dreamgen.h | 6 |
3 files changed, 20 insertions, 22 deletions
diff --git a/devtools/tasmrecover/tasm/proc.py b/devtools/tasmrecover/tasm/proc.py index c127c406f7..ed7053df89 100644 --- a/devtools/tasmrecover/tasm/proc.py +++ b/devtools/tasmrecover/tasm/proc.py @@ -23,9 +23,9 @@ class proc: self.labels.remove(label) except: pass - for l in self.stmts: - if isinstance(l, op.label) and l.name == label: - self.stmts.remove(l) + for i in xrange(len(self.stmts)): + if isinstance(self.stmts[i], op.label) and self.stmts[i].name == label: + self.stmts[i] = op._nop(None) return def optimize_sequence(self, cls): @@ -48,7 +48,8 @@ class proc: n = j - i if n > 1: print "Eliminate consequtive storage instructions at %u-%u" %(i, j) - del stmts[i + 1:j] + for k in range(i+1,j): + stmts[k] = op._nop(None) stmts[i].repeat = n else: i = j @@ -63,7 +64,7 @@ class proc: if isinstance(stmts[i + 1], cls): stmts[i + 1].repeat = 'cx' stmts[i + 1].clear_cx = True - del stmts[i] + stmts[i] = op._nop(None) i += 1 return @@ -78,7 +79,7 @@ class proc: if not isinstance(self.stmts[i], op.label): continue j = i - while j < len(self.stmts) and isinstance(self.stmts[j], op.label): + while j < len(self.stmts) and isinstance(self.stmts[j], (op.label, op._nop)): j += 1 if j == len(self.stmts) or isinstance(self.stmts[j], op._ret): print "Return label: %s" % (self.stmts[i].name,) @@ -121,18 +122,14 @@ class proc: print self.labels self.remove_label(s.name) - #removing duplicate rets - i = 0 - while i < len(self.stmts)-1: - if isinstance(self.stmts[i], op._ret) and isinstance(self.stmts[i+1], op._ret): - del self.stmts[i] - else: - i += 1 - - #removing last ret - while len(self.stmts) > 0 and isinstance(self.stmts[-1], op._ret) and (len(self.stmts) < 2 or not isinstance(self.stmts[-2], op.label)): - print "stripping last ret" - self.stmts.pop() + #removing duplicate rets and rets at end + for i in xrange(len(self.stmts)): + if isinstance(self.stmts[i], op._ret): + j = i+1 + while j < len(self.stmts) and isinstance(self.stmts[j], op._nop): + j += 1 + if j == len(self.stmts) or isinstance(self.stmts[j], op._ret): + self.stmts[i] = op._nop(None) self.optimize_sequence(op._stosb); self.optimize_sequence(op._stosw); diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 9349436ca2..da0d71f7fe 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -13226,7 +13226,7 @@ void DreamGenContext::useaxe() { return; notinpool: showfirstuse(); -/*continuing to unbounded code: axeondoor from useelvdoor:19-29*/ +/*continuing to unbounded code: axeondoor from useelvdoor:19-30*/ axeondoor: al = 15; cx = 300; @@ -16886,6 +16886,7 @@ alreadynewgame: void DreamGenContext::doload() { STACK_CHECK; + data.byte(kLoadingorsave) = 1; showopbox(); showloadops(); data.byte(kCurrentslot) = 0; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 2d05f9c791..b012663ab6 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -600,6 +600,7 @@ public: void clearbuffers(); void neterror(); void storeit(); + void lockeddoorway(); void isitworn(); void putundertimed(); void dumpmap(); @@ -954,8 +955,9 @@ public: void showmonk(); void diarykeyn(); void set16colpalette(); - void sparky(); + void convicons(); void interviewer(); + void sparky(); void purgeanitem(); void madman(); void createpanel(); @@ -1250,14 +1252,12 @@ public: void usechurchgate(); void monkandryan(); void allocatebuffers(); - void convicons(); void swapwithinv(); void usecontrol(); void buttonseven(); void redrawmainscrn(); void finishedwalking(); void findallryan(); - void lockeddoorway(); void channel0tran(); void buttonpress(); void parseblaster(); |