aboutsummaryrefslogtreecommitdiff
path: root/devtools/tasmrecover/tasm/proc.py
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2011-06-21 23:50:01 +0200
committerWillem Jan Palenstijn2011-06-22 00:00:56 +0200
commit25513893044032b2595992936e1e6011889197fd (patch)
tree23b362805b2202c5475de2d73b79a5856e9b5b27 /devtools/tasmrecover/tasm/proc.py
parent55ed69dbab7a4856c59fe676cc6721110cb405e6 (diff)
downloadscummvm-rg350-25513893044032b2595992936e1e6011889197fd.tar.gz
scummvm-rg350-25513893044032b2595992936e1e6011889197fd.tar.bz2
scummvm-rg350-25513893044032b2595992936e1e6011889197fd.zip
DREAMWEB: Fix bug in tasmrecover causing load/save mixup
This is a regression from c1b9adb6912 and (my commit) 287c23f1263c. It is not safe to remove opcodes from proc.stmts since labels are sometimes referenced by their offset in the list. So, instead they are now replaced by op._nop. This fixes kLoadingorsave not being set in doload(), which was visible when going to the load game menu from the startup menu.
Diffstat (limited to 'devtools/tasmrecover/tasm/proc.py')
-rw-r--r--devtools/tasmrecover/tasm/proc.py33
1 files changed, 15 insertions, 18 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);