diff options
author | Bertrand Augereau | 2011-08-15 14:35:44 +0200 |
---|---|---|
committer | Bertrand Augereau | 2011-08-15 22:30:16 +0200 |
commit | b0f5e4dfb07062002a52ded364eb02d8fc7f1dc6 (patch) | |
tree | af4e37ed16cba85a6cb2e24bf4fe99ea0090cbb1 | |
parent | 8cb9ff31cf67c3161c9513e36cdba48db55f4ed9 (diff) | |
download | scummvm-rg350-b0f5e4dfb07062002a52ded364eb02d8fc7f1dc6.tar.gz scummvm-rg350-b0f5e4dfb07062002a52ded364eb02d8fc7f1dc6.tar.bz2 scummvm-rg350-b0f5e4dfb07062002a52ded364eb02d8fc7f1dc6.zip |
DREAMWEB: 'copyname' ported to C++
-rwxr-xr-x | devtools/tasmrecover/tasm-recover | 1 | ||||
-rw-r--r-- | engines/dreamweb/dreamgen.cpp | 28 | ||||
-rw-r--r-- | engines/dreamweb/dreamgen.h | 3 | ||||
-rw-r--r-- | engines/dreamweb/stubs.cpp | 46 | ||||
-rw-r--r-- | engines/dreamweb/stubs.h | 5 |
5 files changed, 35 insertions, 48 deletions
diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index d0cbae8fe5..f75a4aa82b 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -108,6 +108,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'checkifperson', 'getreelstart', 'findobname', + 'copyname', ], skip_output = [ # These functions are processed but not output 'dreamweb', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index b72c83b40c..42a6a64fa0 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -17395,33 +17395,6 @@ success: data.byte(kTurndirection) = 0; } -void DreamGenContext::copyname() { - STACK_CHECK; - push(di); - findobname(); - di = pop(); - es = cs; - cx = 28; -make: - _lodsb(); - _cmp(al, ':'); - if (flags.z()) - goto finishmakename; - _cmp(al, 0); - if (flags.z()) - goto finishmakename; - _stosb(); - if (--cx) - goto make; -finishmakename: - _inc(cx); - al = 0; - _stosb(); - return; - al = 255; - _stosb(cx, true); -} - void DreamGenContext::showicon() { STACK_CHECK; _cmp(data.byte(kReallocation), 50); @@ -19842,7 +19815,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_setwalk: setwalk(); break; case addr_bresenhams: bresenhams(); break; case addr_workoutframes: workoutframes(); break; - case addr_copyname: copyname(); break; case addr_showicon: showicon(); break; case addr_middlepanel: middlepanel(); break; case addr_showman: showman(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 4a8bcbd1a1..9c08a335c9 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -115,7 +115,6 @@ public: static const uint16 addr_showman = 0xca6c; static const uint16 addr_middlepanel = 0xca68; static const uint16 addr_showicon = 0xca64; - static const uint16 addr_copyname = 0xca5c; static const uint16 addr_workoutframes = 0xca54; static const uint16 addr_bresenhams = 0xca50; static const uint16 addr_setwalk = 0xca44; @@ -1784,7 +1783,7 @@ public: void drawitall(); void usestereo(); void showcurrentfile(); - void copyname(); + //void copyname(); void look(); void setmouse(); void checkone(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 4fcc1e4698..e15bc2aab9 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -1000,28 +1000,42 @@ bool DreamGenContext::checkifperson(uint8 x, uint8 y) { return false; } -void DreamGenContext::findobname() { - findobname(ah, al); -} - -void DreamGenContext::findobname(uint8 type, uint8 index) { +const uint8 *DreamGenContext::findobname(uint8 type, uint8 index) { if (type == 5) { - uint16 offset = 64 * 2 * (index & 127); - ds = data.word(kPeople); - si = ds.word(kPersontxtdat + offset) + kPersontext; + uint16 i = 64 * 2 * (index & 127); + uint16 offset = segRef(data.word(kPeople)).word(kPersontxtdat + i) + kPersontext; + return segRef(data.word(kPeople)).ptr(offset, 0); } else if (type == 4) { - ds = data.word(kExtras); - si = ds.word(kExtextdat + index * 2) + kExtext; + uint16 offset = segRef(data.word(kExtras)).word(kExtextdat + index * 2) + kExtext; + return segRef(data.word(kExtras)).ptr(offset, 0); } else if (type == 2) { - ds = data.word(kFreedesc); - si = ds.word(kFreetextdat + index * 2) + kFreetext; + uint16 offset = segRef(data.word(kFreedesc)).word(kFreetextdat + index * 2) + kFreetext; + return segRef(data.word(kFreedesc)).ptr(offset, 0); } else if (type == 1) { - ds = data.word(kSetdesc); - si = ds.word(kSettextdat + index * 2) + kSettext; + uint16 offset = segRef(data.word(kSetdesc)).word(kSettextdat + index * 2) + kSettext; + return segRef(data.word(kSetdesc)).ptr(offset, 0); } else { - ds = data.word(kBlockdesc); - si = ds.word(kBlocktextdat + index * 2) + kBlocktext; + uint16 offset = segRef(data.word(kBlockdesc)).word(kBlocktextdat + index * 2) + kBlocktext; + return segRef(data.word(kBlockdesc)).ptr(offset, 0); + } +} + +void DreamGenContext::copyname() { + copyname(ah, al, cs.ptr(di, 0)); +} + +void DreamGenContext::copyname(uint8 type, uint8 index, uint8 *dst) { + const uint8 *src = findobname(type, index); + size_t i; + for (i = 0; i < 28; ++i) { + char c = src[i]; + if (c == ':') + break; + if (c == 0) + break; + dst[i] = c; } + dst[i] = 0; } } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index b9d22c25c5..27250b7451 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -121,6 +121,7 @@ void doblocks(); void checkifperson(); bool checkifperson(uint8 x, uint8 y); - void findobname(); - void findobname(uint8 type, uint8 index); + const uint8 *findobname(uint8 type, uint8 index); + void copyname(); + void copyname(uint8 type, uint8 index, uint8 *dst); |