From d8d16e0231272e73f72630c5a1966db6f1e29809 Mon Sep 17 00:00:00 2001 From: Vladimir Menshakov Date: Thu, 16 Jun 2011 16:44:58 +0400 Subject: [PATCH] DREAMWEB: removed while loops from rep+stos/movs instructions --- devtools/tasmrecover/tasm/proc.py | 14 +++ engines/dreamweb/dreamgen.cpp | 171 ++++++++++-------------------- 2 files changed, 71 insertions(+), 114 deletions(-) diff --git a/devtools/tasmrecover/tasm/proc.py b/devtools/tasmrecover/tasm/proc.py index 3c4ac213722..1350ea1e0b8 100644 --- a/devtools/tasmrecover/tasm/proc.py +++ b/devtools/tasmrecover/tasm/proc.py @@ -34,6 +34,9 @@ class proc: if not isinstance(stmts[i], cls): i += 1 continue + if i > 0 and isinstance(stmts[i - 1], op._rep): #skip rep prefixed instructions for now + i += 1 + continue j = i + 1 while j < len(stmts): @@ -49,6 +52,17 @@ class proc: else: i = j + i = 0 + while i < len(stmts): + if not isinstance(stmts[i], op._rep): + i += 1 + continue + if i + 1 >= len(stmts): + break + if isinstance(stmts[i + 1], cls): + stmts[i + 1].repeat = 'context.cx' + del stmts[i] + i += 1 return def optimize(self): diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index e6b6d738fd8..ba1e5ba1597 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -2711,8 +2711,7 @@ void clearsprites(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768); context.al = 255; context.cx = (32)*16; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); } void makesprite(Context &context) { @@ -2740,8 +2739,7 @@ void delsprite(Context &context) { context.di = context.bx; context.cx = (32); context.al = 255; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); } void spriteupdate(Context &context) { @@ -4082,8 +4080,7 @@ void updatepeople(Context &context) { context.data.word(kListpos) = context.di; context.cx = 12*5; context.al = 255; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context._inc(context.data.word(kMaintimer)); context.es = context.cs; context.bx = 534; @@ -4726,8 +4723,7 @@ void delthisone(Context &context) { deloneloop: context.push(context.cx); context.ch = 0; - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.cx = context.pop(); context._add(context.di, context.ax); context._add(context.si, context.dx); @@ -5093,8 +5089,7 @@ void transferinv(Context &context) { context._mul(context.cx); context.cx = context.ax; context.push(context.cx); - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.cx = context.pop(); context.ax = context.pop(); context.es.word(context.bx+2) = context.ax; @@ -5141,8 +5136,7 @@ void transfermap(Context &context) { context._mul(context.cx); context.cx = context.ax; context.push(context.cx); - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.cx = context.pop(); context.ax = context.pop(); context.es.word(context.bx+2) = context.ax; @@ -5181,8 +5175,7 @@ void clearendpal(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); context.cx = 768; context.al = 0; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); } void clearpalette(Context &context) { @@ -5208,8 +5201,7 @@ void fadetowhite(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); context.cx = 768; context.al = 63; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); context.al = 0; context._stosb(3); @@ -5226,8 +5218,7 @@ void fadefromwhite(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)); context.cx = 768; context.al = 63; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)); context.al = 0; context._stosb(3); @@ -5267,13 +5258,11 @@ halfend: context.si = (0+(180*10)+32+60+(32*32)+(11*10*3))+(56*3); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(56*3); context.cx = 3*5; - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.si = (0+(180*10)+32+60+(32*32)+(11*10*3))+(77*3); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(77*3); context.cx = 3*2; - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.data.byte(kFadedirection) = 1; context.data.byte(kFadecount) = 31; context.data.byte(kColourpos) = 0; @@ -5583,8 +5572,7 @@ void paltostartpal(Context &context) { context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)); context.cx = 768/2; - while(context.cx--) - context._movsw(); + context._movsw(context.cx); } void endpaltostart(Context &context) { @@ -5594,8 +5582,7 @@ void endpaltostart(Context &context) { context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)); context.cx = 768/2; - while(context.cx--) - context._movsw(); + context._movsw(context.cx); } void startpaltoend(Context &context) { @@ -5605,8 +5592,7 @@ void startpaltoend(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)); context.cx = 768/2; - while(context.cx--) - context._movsw(); + context._movsw(context.cx); } void paltoendpal(Context &context) { @@ -5616,8 +5602,7 @@ void paltoendpal(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768); context.cx = 768/2; - while(context.cx--) - context._movsw(); + context._movsw(context.cx); } void allpalette(Context &context) { @@ -5627,8 +5612,7 @@ void allpalette(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)); context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768); context.cx = 768/2; - while(context.cx--) - context._movsw(); + context._movsw(context.cx); dumpcurrent(context); } @@ -5654,8 +5638,7 @@ void fadedownmon(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(231*3); context.cx = 3*8; context.ax = 0; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(246*3); context._stosb(); context._stosw(); @@ -5675,8 +5658,7 @@ void fadeupmon(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(231*3); context.cx = 3*8; context.ax = 0; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3); context._stosb(); context._stosw(); @@ -5696,8 +5678,7 @@ void fadeupmonfirst(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(231*3); context.cx = 3*8; context.ax = 0; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3); context._stosb(); context._stosw(); @@ -5720,8 +5701,7 @@ void fadeupyellows(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(231*3); context.cx = 3*8; context.ax = 0; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(246*3); context._stosb(); context._stosw(); @@ -5740,8 +5720,7 @@ void initialmoncols(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(230*3); context.cx = 3*9; context.ax = 0; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3); context._stosb(); context._stosw(); @@ -6718,8 +6697,7 @@ void findallryan(Context &context) { context.push(context.di); context.cx = 30; context.ax = 0x0ffff; - while(context.cx--) - context._stosw(); + context._stosw(context.cx); context.di = context.pop(); context.cl = 4; context.ds = context.data.word(kExtras); @@ -6754,8 +6732,7 @@ void findallopen(Context &context) { context.push(context.di); context.cx = 16; context.ax = 0x0ffff; - while(context.cx--) - context._stosw(); + context._stosw(context.cx); context.di = context.pop(); context.cl = context.data.byte(kOpenedob); context.dl = context.data.byte(kOpenedtype); @@ -8572,8 +8549,7 @@ void transfertoex(Context &context) { context.ds = context.data.word(kFreedat); context.si = context.ax; context.cx = 8; - while(context.cx--) - context._movsw(); + context._movsw(context.cx); context.di = context.pop(); context.al = context.data.byte(kReallocation); context.es.byte(context.di) = context.al; @@ -8653,8 +8629,7 @@ void transfercontoex(Context &context) { context.ds = context.pop(); context.push(context.di); context.cx = 8; - while(context.cx--) - context._movsw(); + context._movsw(context.cx); context.di = context.pop(); context.dx = context.pop(); context.al = context.data.byte(kReallocation); @@ -8830,8 +8805,7 @@ void deleteexobject(Context &context) { context.push(context.cx); context.al = 255; context.cx = 16; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.ax = context.pop(); context.cl = context.al; context._add(context.al, context.al); @@ -8891,8 +8865,7 @@ void deleteexframe(Context &context) { context._add(context.si, context.ax); context.push(context.ax); context.ds = context.es; - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.bx = context.pop(); context._sub(context.data.word(kExframepos), context.bx); context.si = context.pop(); @@ -8936,8 +8909,7 @@ findlenextext: context.push(context.bx); context.push(context.ax); context._sub(context.cx, context.bx); - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.bx = context.pop(); context._sub(context.data.word(kExtextpos), context.bx); context.si = context.pop(); @@ -9185,8 +9157,7 @@ oberase: context.di = context.bx; context.al = 255; context.cx = (32); - while(context.cx--) - context._stosb(); + context._stosb(context.cx); notthisob: context.bx = context.pop(); context.cx = context.pop(); @@ -9205,8 +9176,7 @@ void showallobs(Context &context) { context.di = context.bx; context.cx = 128*5; context.al = 255; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.es = context.data.word(kSetframes); context.data.word(kFrsegment) = context.es; context.ax = (0); @@ -9331,8 +9301,7 @@ void showallfree(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)); context.cx = 80*5; context.al = 255; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.es = context.data.word(kFreeframes); context.data.word(kFrsegment) = context.es; context.ax = (0); @@ -9415,8 +9384,7 @@ void showallex(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)); context.cx = 100*5; context.al = 255; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.es = context.data.word(kExtras); context.data.word(kFrsegment) = context.es; context.ax = (0); @@ -10623,14 +10591,12 @@ void usemon(Context &context) { context.di = 2970+1; context.cx = 12; context.al = 32; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.es = context.cs; context.di = 2942+1; context.cx = 12; context.al = 32; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.es = context.cs; context.di = 2836; context.es.byte(context.di) = 1; @@ -11001,8 +10967,7 @@ void input(Context &context) { context.di = 8045; context.cx = 64; context.al = 0; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.data.word(kCurpos) = 0; context.al = '>'; context.di = context.data.word(kMonadx); @@ -11240,8 +11205,7 @@ dirroot: context.di = 2970; context._inc(context.di); context.cx = 12; - while(context.cx--) - context._movsb(); + context._movsb(context.cx); monitorlogo(context); scrollmonitor(context); context.al = 9; @@ -11545,8 +11509,7 @@ keyok2: context.es = context.cs; context.di = 2970+1; context.cx = 12; - while(context.cx--) - context._movsb(); + context._movsb(context.cx); monitorlogo(context); scrollmonitor(context); context.al = 10; @@ -11666,8 +11629,7 @@ void parser(Context &context) { context.di = 2942; context.cx = 13; context.al = 0; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.di = 2942; context.al = '='; context._stosb(); @@ -17017,8 +16979,7 @@ alreadyactsave: context.bx = context.di; context.es = context.cs; context.cx = 16; - while(context.cx--) - context._movsw(); + context._movsw(context.cx); context.al = context.data.byte(kRoomssample); context.es.byte(context.bx+13) = context.al; context.al = context.data.byte(kMapx); @@ -17376,8 +17337,7 @@ void namestoold(Context &context) { context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)); context.es = context.data.word(kBuffers); context.cx = 17*4; - while(context.cx--) - context._movsb(); + context._movsb(context.cx); } void oldtonames(Context &context) { @@ -17387,8 +17347,7 @@ void oldtonames(Context &context) { context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)); context.ds = context.data.word(kBuffers); context.cx = 17*4; - while(context.cx--) - context._movsb(); + context._movsb(context.cx); } void saveposition(Context &context) { @@ -17797,8 +17756,7 @@ void trysoundalloc(Context &context) { context.di = 0; context.cx = 16384/2; context.ax = 0x7f7f; - while(context.cx--) - context._stosw(); + context._stosw(context.cx); context.data.byte(kNeedsoundbuff) = 1; return; soundfail: @@ -17940,8 +17898,7 @@ notch0only: context.di = context.data.word(kSoundbufferwrite); context.cx = 1024; context.ax = 0x7f7f; - while(context.cx--) - context._stosw(); + context._stosw(context.cx); context._and(context.di, 16384-1); context.data.word(kSoundbufferwrite) = context.di; } @@ -18013,8 +17970,7 @@ void channel0tran(Context &context) { if (!context.flags.z()) goto lowvolumetran; context.cx = 1024; - while(context.cx--) - context._movsw(); + context._movsw(context.cx); return; lowvolumetran: context.cx = 1024; @@ -18465,28 +18421,24 @@ void clearbuffers(Context &context) { context.cx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534+68-0)/2; context.ax = 0; context.di = 0; - while(context.cx--) - context._stosw(); + context._stosw(context.cx); context.es = context.data.word(kExtras); context.cx = (0+2080+30000+(16*114)+((114+2)*2)+18000)/2; context.ax = 0x0ffff; context.di = 0; - while(context.cx--) - context._stosw(); + context._stosw(context.cx); context.es = context.data.word(kBuffers); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)); context.ds = context.cs; context.si = 534; context.cx = (991-534); - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.es = context.data.word(kBuffers); context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534); context.ds = context.cs; context.si = 0; context.cx = (68-0); - while(context.cx--) - context._movsb(); + context._movsb(context.cx); clearchanges(context); } @@ -18496,22 +18448,19 @@ void clearchanges(Context &context) { context.cx = (250)*2; context.ax = 0x0ffff; context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)); - while(context.cx--) - context._stosw(); + context._stosw(context.cx); context.ds = context.data.word(kBuffers); context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)); context.es = context.cs; context.di = 534; context.cx = (991-534); - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.ds = context.data.word(kBuffers); context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534); context.es = context.cs; context.di = 0; context.cx = (68-0); - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.data.byte(kExpos) = 0; context.data.word(kExframepos) = 0; context.data.word(kExtextpos) = 0; @@ -18519,8 +18468,7 @@ void clearchanges(Context &context) { context.cx = (0+2080+30000+(16*114)+((114+2)*2)+18000)/2; context.ax = 0x0ffff; context.di = 0; - while(context.cx--) - context._stosw(); + context._stosw(context.cx); context.es = context.cs; context.di = 8011; context.al = 1; @@ -18531,8 +18479,7 @@ void clearchanges(Context &context) { context._stosb(); context.ax = 0; context.cx = 6; - while(context.cx--) - context._stosw(); + context._stosw(context.cx); } void clearbeforeload(Context &context) { @@ -18563,8 +18510,7 @@ void clearrest(Context &context) { context.cx = (66*60)/2; context.ax = 0; context.di = (0); - while(context.cx--) - context._stosw(); + context._stosw(context.cx); context.es = context.data.word(kBackdrop); deallocatemem(context); context.es = context.data.word(kSetframes); @@ -20607,8 +20553,7 @@ finishmakename: context._stosb(); return; context.al = 255; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); } void findobname(Context &context) { @@ -21827,8 +21772,7 @@ blimey: context.push(context.cx); context.push(context.si); context.cx = (66); - while(context.cx--) - context._movsb(); + context._movsb(context.cx); context.si = context.pop(); context.cx = context.pop(); context._add(context.si, 132); @@ -22083,8 +22027,7 @@ void fillspace(Context &context) { context.push(context.bx); context.di = context.dx; context.es = context.ds; - while(context.cx--) - context._stosb(); + context._stosb(context.cx); context.bx = context.pop(); context.di = context.pop(); context.dx = context.pop();