aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Menshakov2011-06-15 23:38:44 +0400
committerVladimir Menshakov2011-06-15 23:38:44 +0400
commitc1b9adb69122d86665079c619a535095d7fe1507 (patch)
treeae3ee41d8c3c181a24bf41ffa48cb75f714f72dc
parent3b85dede39f6d0f4836788adb6df0ff868434885 (diff)
downloadscummvm-rg350-c1b9adb69122d86665079c619a535095d7fe1507.tar.gz
scummvm-rg350-c1b9adb69122d86665079c619a535095d7fe1507.tar.bz2
scummvm-rg350-c1b9adb69122d86665079c619a535095d7fe1507.zip
DREAMWEB: added unused label elimination. Does not work for some labels, but the most ones are gone.
-rw-r--r--devtools/tasmrecover/tasm/proc.py26
-rw-r--r--engines/dreamweb/dreamgen.cpp28
2 files changed, 25 insertions, 29 deletions
diff --git a/devtools/tasmrecover/tasm/proc.py b/devtools/tasmrecover/tasm/proc.py
index 3a82a74413..57f17518fb 100644
--- a/devtools/tasmrecover/tasm/proc.py
+++ b/devtools/tasmrecover/tasm/proc.py
@@ -16,6 +16,16 @@ class proc:
def add_label(self, label):
self.stmts.append(op.label(label))
self.labels.add(label)
+
+ def remove_label(self, label):
+ try:
+ self.labels.remove(label)
+ except:
+ pass
+ for l in self.stmts:
+ if isinstance(l, op.label) and l.name == label:
+ self.stmts.remove(l)
+ return
def optimize(self):
print "optimizing..."
@@ -47,7 +57,21 @@ class proc:
self.stmts.pop(i)
else:
i += 1
- #fixme: add local?
+
+ #eliminating unused labels
+ for s in list(self.stmts):
+ if not isinstance(s, op.label):
+ continue
+ print "checking label %s..." %s.name
+ used = False
+ for j in self.stmts:
+ if isinstance(j, op.basejmp) and j.label == s.name:
+ print "used"
+ used = True
+ break
+ if not used:
+ print self.labels
+ self.remove_label(s.name)
def add(self, stmt):
#print stmt
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index 211418e22f..cbdb25256c 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -907,7 +907,6 @@ helispeed:
showgamereel(context);
context.al = context.data.byte(kMapx);
context.es.byte(context.bx+1) = context.al;
-helicombatend:
context.ax = context.es.word(context.bx+3);
context._cmp(context.ax, 9);
if (!context.flags.c()) goto notwaitingheli;
@@ -2807,7 +2806,6 @@ continuewalk:
context.ax = context.es.word(context.bx);
context.bx = context.pop();
context.es = context.pop();
-stillline:
context.es.word(context.bx+10) = context.ax;
return;
endofline:
@@ -4252,7 +4250,6 @@ inwatching:
zoomswitch:
context._cmp(context.data.byte(kCommandtype), 199);
if (context.flags.c()) goto zoomit;
-cantzoom:
putunderzoom(context);
return;
zoomit:
@@ -5140,7 +5137,6 @@ greysumloop2:
context.ah = context.data.byte(kAddtored);
context._cmp(context.al, 0);
context._add(context.al, context.ah);
-noaddr:
context._stosb();
context.ah = context.data.byte(kAddtogreen);
context.al = context.bl;
@@ -5805,7 +5801,6 @@ printloopslow5:
if (!context.flags.z()) goto finishslow2;
keepgoing:
waitframes(context);
-noslow:
context._cmp(context.ax, 0);
if (context.flags.z()) goto afterslow;
context._cmp(context.ax, context.data.word(kOldbutton));
@@ -8816,7 +8811,6 @@ void calcfrframe(Context &context) {
context.ah = 0;
context.data.word(kOffsety) = context.ax;
return;
-nullframe:
context.ax = context.pop();
context.cx = 0;
context.data.word(kSavesize) = context.cx;
@@ -9054,7 +9048,6 @@ waittalk:
checkcoords(context);
context._cmp(context.data.byte(kGetback), 0);
if (context.flags.z()) goto waittalk;
-finishtalk:
context.bx = context.data.word(kPersondata);
context.es = context.cs;
context._cmp(context.data.byte(kTalkpos), 4);
@@ -9533,7 +9526,6 @@ alreadyinfo:
worktoscreenm(context);
context.cx = 500;
hangonp(context);
-afterinfo:
context.data.byte(kPointermode) = 0;
context.data.byte(kPointerframe) = 0;
putundercentre(context);
@@ -9653,7 +9645,6 @@ void showarrows(Context &context) {
void nextdest(Context &context) {
STACK_CHECK(context);
-duok:
context._cmp(context.data.byte(kCommandtype), 218);
if (context.flags.z()) goto alreadydu;
context.data.byte(kCommandtype) = 218;
@@ -9692,7 +9683,6 @@ nodu:
void lastdest(Context &context) {
STACK_CHECK(context);
-ddok:
context._cmp(context.data.byte(kCommandtype), 219);
if (context.flags.z()) goto alreadydd;
context.data.byte(kCommandtype) = 219;
@@ -9904,7 +9894,6 @@ moreinput:
execcommand(context);
context._cmp(context.al, 0);
if (context.flags.z()) goto moreinput;
-endmon:
getridoftemp(context);
getridoftempcharset(context);
context.es = context.data.word(kTextfile1);
@@ -10522,7 +10511,6 @@ checkpass:
if (context.flags.z()) goto passpassed;
context._cmp(context.al, context.ah);
if (context.flags.z()) goto checkpass;
-passerror:
context.bx = context.pop();
context.es = context.pop();
scrollmonitor(context);
@@ -11073,7 +11061,6 @@ void delcurs(Context &context) {
context.bx = context.pop();
context.di = context.pop();
multidump(context);
-finishcurdel:
context.si = context.pop();
context.dx = context.pop();
context.ds = context.pop();
@@ -13393,7 +13380,6 @@ void dochange(Context &context) {
if (context.flags.z()) goto object;
context._cmp(context.ch, 1);
if (context.flags.z()) goto freeobject;
-path:
context.push(context.cx);
context.ah = 0;
context._add(context.ax, context.ax);
@@ -13411,7 +13397,6 @@ path:
context.es = context.data.word(kReels);
context.cx = context.pop();
context.es.byte(context.bx+6) = context.cl;
-nopath:
return;
object:
context.push(context.cx);
@@ -14395,7 +14380,6 @@ menuloop:
restorereels(context);
worktoscreenm(context);
return;
-menulist:
return;
}
@@ -15228,7 +15212,6 @@ diaryloop:
redrawmainscrn(context);
worktoscreenm(context);
return;
-diarylist:
return;
}
@@ -15899,7 +15882,6 @@ notret:
context.es.byte(context.bx+1) = 1;
goto afterkey;
nodel2:
-spacepress:
context._cmp(context.data.byte(kCursorpos), 14);
if (context.flags.z()) goto nokeypress;
getnamepos(context);
@@ -16205,7 +16187,6 @@ void saveposition(Context &context) {
context.ds = context.dx;
context.dx = 534;
saveseg(context);
-fquit:
closefile(context);
}
@@ -16769,7 +16750,6 @@ slow:
context._inc(context.bx);
context._cmp(context.al, context.dh);
if (!context.flags.c()) goto toplot;
-botlot:
context._cmp(context.ah, context.dh);
if (!context.flags.c()) goto nodistort;
context._add(context.al, context.ah);
@@ -16815,7 +16795,6 @@ lowvolumemix:
context._inc(context.bx);
context._cmp(context.al, context.dh);
if (!context.flags.c()) goto toplotv;
-botlotv:
context._cmp(context.ah, context.dh);
if (!context.flags.c()) goto nodistortv;
context._add(context.al, context.ah);
@@ -17736,7 +17715,6 @@ noobselect:
diff:
context.data.byte(kCommand) = context.al;
context.data.byte(kCommandtype) = context.ah;
-diff2:
context._cmp(context.data.byte(kLinepointer), 254);
if (!context.flags.z()) goto middleofwalk;
context._cmp(context.data.word(kWatchingtime), 0);
@@ -17851,7 +17829,6 @@ loop048:
if (!context.flags.l()) goto over045;
context.ax = context.cs.word(context.bx+8);
__dispatch_call(context, context.ax);
-finished:
context.ax = context.pop();
return;
over045:
@@ -18472,7 +18449,6 @@ noobselect:
diff:
context.data.byte(kCommand) = context.al;
context.data.byte(kCommandtype) = context.ah;
-diff2:
context._cmp(context.data.byte(kLinepointer), 254);
if (!context.flags.z()) goto middleofwalk;
context._cmp(context.data.word(kWatchingtime), 0);
@@ -19004,7 +18980,6 @@ gotquad:
context._add(context.ax, 32);
context._sub(context.bx, context.ax);
if (context.flags.c()) goto isinright;
-isinleft:
context.cx = context.data.word(kLinestarty);
context._add(context.cx, 32);
context.ax = context.data.word(kLineendy);
@@ -19057,7 +19032,6 @@ void copyname(Context &context) {
findobname(context);
context.di = context.pop();
context.es = context.cs;
-copytext:
context.cx = 28;
make:
context._lodsb();
@@ -19782,7 +19756,6 @@ notwatchpoint:
if (context.flags.z()) goto gothand;
context._cmp(context.data.byte(kPointerfirstpath), 0);
if (context.flags.z()) goto gothand;
-arrow:
getflagunderp(context);
context._cmp(context.cl, 2);
if (context.flags.c()) goto gothand;
@@ -20643,7 +20616,6 @@ loadnew:
context.data.byte(kCommandtype) = 255;
worktoscreenm(context);
goto mainloop;
-alreadyloaded:
context.data.byte(kNewlocation) = 255;
clearsprites(context);
initman(context);