[Scummvm-cvs-logs] CVS: scummvm/saga sthread.cpp,1.59,1.60
Torbjörn Andersson
eriktorbjorn at users.sourceforge.net
Sun Jan 16 09:08:07 CET 2005
Update of /cvsroot/scummvm/scummvm/saga
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13630
Modified Files:
sthread.cpp
Log Message:
Some more untested opcode fixes. (By the way, I was wrong the other day:
The first IHNM script does not use random branching after all.)
Index: sthread.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sthread.cpp,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -d -r1.59 -r1.60
--- sthread.cpp 15 Jan 2005 20:12:49 -0000 1.59
+++ sthread.cpp 16 Jan 2005 17:07:27 -0000 1.60
@@ -270,7 +270,8 @@
// STACK INSTRUCTIONS
case 0x02: // Dup top element (DUP)
- thread->push(thread->stackTop());
+ param1 = thread->stackTop();
+ thread->push(param1);
break;
case 0x03: // Pop nothing (POPN)
thread->pop();
@@ -304,12 +305,11 @@
case 0x0F: // Modify flag (MODF)
n_buf = scriptS.readByte();
param1 = (ScriptDataWord)scriptS.readUint16LE();
- bitstate = getUWord(param1);
data = thread->stackTop();
- if (bitstate) {
- setBit(n_buf, data, 1);
+ if (data) {
+ setBit(n_buf, param1, 1);
} else {
- setBit(n_buf, data, 0);
+ setBit(n_buf, param1, 0);
}
break;
case 0x10: // Put word (PUTW)
@@ -321,9 +321,8 @@
case 0x13: // Modify flag and pop (MDFP)
n_buf = scriptS.readByte();
param1 = (ScriptDataWord)scriptS.readUint16LE();
- param1 = thread->pop();
- bitstate = getUWord(param1);
- if (bitstate) {
+ data = thread->pop();
+ if (data) {
setBit(n_buf, param1, 1);
} else {
setBit(n_buf, param1, 0);
@@ -398,6 +397,7 @@
break;
case opReturn: // Return with value
scriptRetVal = thread->pop();
+ // Fall through
case opReturnV: // Return with void
thread->stackPtr = thread->framePtr;
setFramePtr(thread, thread->pop());
@@ -509,45 +509,43 @@
// (NEG) Negate stack by 2's complement
case 0x25:
data = thread->pop();
- data = ~data;
- data++;
- thread->push(data);
+ thread->push(-data);
break;
// (TSTZ) Test for zero
case 0x26:
data = thread->pop();
- data = data ? 0 : 1;
- thread->push(data);
+ thread->push(!data);
break;
// (NOT) Binary not
case 0x27:
data = thread->pop();
- data = ~data;
- thread->push(data);
+ thread->push(~data);
break;
case 0x28: // inc_v increment, don't push
- unhandled = 1;
- //debug(2, "??? ");
- scriptS.readByte();
- scriptS.readUint16LE();
+ n_buf = scriptS.readByte();
+ param1 = scriptS.readUint16LE();
+ getWord(n_buf, param1, &data);
+ putWord(n_buf, param1, data + 1);
break;
case 0x29: // dec_v decrement, don't push
- unhandled = 1;
- //debug(2, "??? ");
- scriptS.readByte();
- scriptS.readUint16LE();
+ n_buf = scriptS.readByte();
+ param1 = scriptS.readUint16LE();
+ getWord(n_buf, param1, &data);
+ putWord(n_buf, param1, data - 1);
break;
case 0x2A: // postinc
- unhandled = 1;
- //debug(2, "??? ");
- scriptS.readByte();
- scriptS.readUint16LE();
+ n_buf = scriptS.readByte();
+ param1 = scriptS.readUint16LE();
+ getWord(n_buf, param1, &data);
+ thread->push(data);
+ putWord(n_buf, param1, data + 1);
break;
case 0x2B: // postdec
- unhandled = 1;
- //debug(2, "??? ");
- scriptS.readByte();
- scriptS.readUint16LE();
+ n_buf = scriptS.readByte();
+ param1 = scriptS.readUint16LE();
+ getWord(n_buf, param1, &data);
+ thread->push(data);
+ putWord(n_buf, param1, data - 1);
break;
// ARITHMETIC INSTRUCTIONS
More information about the Scummvm-git-logs
mailing list