aboutsummaryrefslogtreecommitdiff
path: root/engines/director
diff options
context:
space:
mode:
Diffstat (limited to 'engines/director')
-rw-r--r--engines/director/archive.cpp8
-rw-r--r--engines/director/frame.cpp2
-rw-r--r--engines/director/lingo/lingo-bytecode.cpp180
-rw-r--r--engines/director/lingo/lingo-code.cpp122
-rw-r--r--engines/director/lingo/lingo-gr.y6
-rw-r--r--engines/director/lingo/lingo.h3
6 files changed, 152 insertions, 169 deletions
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index de3a866524..bbcf26bef5 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -423,10 +423,10 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
tag == MKTAG('D', 'I', 'B', ' ') ||
tag == MKTAG('R', 'T', 'E', '0') ||
tag == MKTAG('R', 'T', 'E', '1') ||
- tag == MKTAG('R', 'T', 'E', '2') ||
- tag == MKTAG('L', 'c', 't', 'x') ||
- tag == MKTAG('L', 'n', 'a', 'm') ||
- tag == MKTAG('L', 's', 'c', 'r'))
+ tag == MKTAG('R', 'T', 'E', '2') ||
+ tag == MKTAG('L', 'c', 't', 'x') ||
+ tag == MKTAG('L', 'n', 'a', 'm') ||
+ tag == MKTAG('L', 's', 'c', 'r'))
_types[tag][i] = res;
}
diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index dd6f9fc02e..6ea3930e58 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -627,7 +627,7 @@ void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) {
int y = _sprites[i]->_startPoint.y - regY + rectTop;
int height = _sprites[i]->_height;
int width = _vm->getVersion() > 4 ? _sprites[i]->_bitmapCast->initialRect.width() : _sprites[i]->_width;
- warning("drawRect: x=%d, y=%d, w=%d h=%d", x, y, width, height);
+ warning("drawRect: x=%d, y=%d, w=%d h=%d", x, y, width, height);
Common::Rect drawRect(x, y, x + width, y + height);
addDrawRect(i, drawRect);
inkBasedBlit(surface, *(_sprites[i]->_bitmapCast->surface), i, drawRect);
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index fcc2236a67..9302c46626 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -29,6 +29,7 @@ static struct LingoV4Bytecode {
const inst func;
const char *proto;
} lingoV4[] = {
+ { 0x01, STOP, "" },
{ 0x03, Lingo::c_voidpush, "" },
{ 0x04, Lingo::c_mul, "" },
{ 0x05, Lingo::c_add, "" },
@@ -56,7 +57,6 @@ static struct LingoV4Bytecode {
{ 0x1b, Lingo::c_field, "" },
{ 0x1c, Lingo::c_tell, "" },
{ 0x1d, Lingo::c_telldone, "" },
-
{ 0x41, Lingo::c_intpush, "b" },
{ 0, 0, 0 }
};
@@ -68,9 +68,7 @@ void Lingo::initBytecode() {
}
-
-
-void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType type, uint16 id) {
+void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType type, uint16 id) {
debugC(1, kDebugLingoCompile, "Add V4 bytecode for type %s with id %d", scriptType2str(type), id);
if (_scriptContexts[type].contains(id)) {
@@ -90,116 +88,118 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType ty
for (uint32 i = 0; i < 0x10; i++) {
stream.readByte();
}
- uint16 code_store_offset = stream.readUint16();
+ uint16 codeStoreOffset = stream.readUint16();
// unk2
for (uint32 i = 0; i < 0x2e; i++) {
stream.readByte();
}
- uint16 globals_offset = stream.readUint16();
- uint16 globals_count = stream.readUint16();
+ uint16 globalsOffset = stream.readUint16();
+ uint16 globalsCount = stream.readUint16();
// unk3
for (uint32 i = 0; i < 0x4; i++) {
stream.readByte();
}
- uint16 functions_count = stream.readUint16();
+ uint16 functionsCount = stream.readUint16();
stream.readUint16();
- uint16 functions_offset = stream.readUint16();
- uint16 consts_count = stream.readUint16();
+ uint16 functionsOffset = stream.readUint16();
+ uint16 constsCount = stream.readUint16();
stream.readUint16();
- uint16 consts_offset = stream.readUint16();
+ uint16 constsOffset = stream.readUint16();
stream.readUint16();
stream.readUint16();
stream.readUint16();
- uint16 consts_base = stream.readUint16();
+ uint16 constsBase = stream.readUint16();
// preload all the constants!
// these are stored as a reference table of 6 byte entries, followed by a storage area.
// copy the storage area first.
- uint32 consts_store_offset = consts_offset+6*consts_count;
- uint32 consts_store_size = stream.size()-consts_store_offset;
- stream.seek(consts_store_offset);
- byte *const_store = (byte *)malloc(consts_store_size);
- stream.read(const_store, consts_store_size);
+ uint32 constsStoreOffset = constsOffset + 6 * constsCount;
+ uint32 constsStoreSize = stream.size() - constsStoreOffset;
+ stream.seek(constsStoreOffset);
+ byte *constsStore = (byte *)malloc(constsStoreSize);
+ stream.read(constsStore, constsStoreSize);
- Common::Array<Datum> const_data;
+ Common::Array<Datum> constsData;
// read each entry in the reference table.
- stream.seek(consts_offset);
- for (uint16 i=0; i<consts_count; i++) {
+ stream.seek(constsOffset);
+ for (uint16 i=0; i < constsCount; i++) {
Datum constant;
- uint16 const_type = stream.readUint16();
+ uint16 constType = stream.readUint16();
uint32 value = stream.readUint32();
- switch (const_type) {
- case 1: { // String type
- constant.type = STRING;
- constant.u.s = new Common::String();
- uint32 pointer = value;
- while (pointer < consts_store_size) {
- if (const_store[pointer] == '\r') {
- constant.u.s += '\n';
- } else if (const_store[pointer] == '\0') {
+ switch (constType) {
+ case 1: // String type
+ {
+ constant.type = STRING;
+ constant.u.s = new Common::String();
+ uint32 pointer = value;
+ while (pointer < constsStoreSize) {
+ if (constsStore[pointer] == '\r') {
+ constant.u.s += '\n';
+ } else if (constsStore[pointer] == '\0') {
+ break;
+ } else {
+ constant.u.s += constsStore[pointer];
+ }
+ pointer += 1;
+ }
+ if (pointer >= constsStoreSize) {
+ warning("Constant string has no null terminator");
break;
- } else {
- constant.u.s += const_store[pointer];
}
- pointer += 1;
- }
- if (pointer >= consts_store_size) {
- warning("Constant string has no null terminator");
- break;
}
- }
- break;
+ break;
case 4: // Integer type
constant.type = INT;
constant.u.i = (int)value;
break;
- case 9: { // Float type
- constant.type = FLOAT;
- if (value < consts_store_offset) {
- warning("Constant float start offset is out of bounds");
- break;
- } else if (value+4 > consts_store_size) {
- warning("Constant float end offset is out of bounds");
- break;
+ case 9: // Float type
+ {
+ constant.type = FLOAT;
+ if (value < constsStoreOffset) {
+ warning("Constant float start offset is out of bounds");
+ break;
+ } else if (value + 4 > constsStoreSize) {
+ warning("Constant float end offset is out of bounds");
+ break;
+ }
+ constant.u.f = *(float *)(constsStore + value);
}
- constant.u.f = *(float *)(const_store+value);
- }
- break;
+ break;
default:
warning("Unknown constant type %d", type);
break;
}
- const_data.push_back(constant);
+ constsData.push_back(constant);
}
- free(const_store);
+ free(constsStore);
// parse each function!
// these are stored as a code storage area, followed by a reference table of 42 byte entries.
// copy the storage area first.
- uint32 code_store_size = functions_offset - code_store_offset;
- stream.seek(code_store_offset);
- byte *code_store = (byte *)malloc(code_store_size);
- stream.read(code_store, code_store_size);
+ uint32 codeStoreSize = functionsOffset - codeStoreOffset;
+ stream.seek(codeStoreOffset);
+ byte *codeStore = (byte *)malloc(codeStoreSize);
+ stream.read(codeStore, codeStoreSize);
// read each entry in the function table.
- stream.seek(functions_offset);
- for (uint16 i=0; i<functions_count; i++) {
+ stream.seek(functionsOffset);
+ for (uint16 i=0; i<functionsCount; i++) {
_currentScriptFunction = i;
_currentScriptContext->functions.push_back(new ScriptData);
_currentScript = _currentScriptContext->functions[_currentScriptFunction];
- uint16 name_index = stream.readUint16();
+ uint16 nameIndex = stream.readUint16();
stream.readUint16();
uint32 length = stream.readUint32();
- uint32 start_offset = stream.readUint32();
- uint16 arg_count = stream.readUint16();
- uint32 arg_offset = stream.readUint32();
- uint16 var_count = stream.readUint16();
- uint32 var_names_offset = stream.readUint32();
+ uint32 startOffset = stream.readUint32();
+ uint16 argCount = stream.readUint16();
+ uint32 argOffset = stream.readUint32();
+ uint16 varCount = stream.readUint16();
+ uint32 varNamesOffset = stream.readUint32();
stream.readUint16();
stream.readUint16();
stream.readUint16();
@@ -210,35 +210,35 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType ty
stream.readUint16();
stream.readUint16();
- if (start_offset < code_store_offset) {
+ if (startOffset < codeStoreOffset) {
warning("Function %d start offset is out of bounds!", i);
continue;
- } else if (start_offset + length >= code_store_offset + code_store_size) {
+ } else if (startOffset + length >= codeStoreOffset + codeStoreSize) {
warning("Function %d end offset is out of bounds", i);
continue;
}
- uint16 pointer = start_offset-code_store_offset;
- Common::Array<uint32> offset_list;
- while (pointer < start_offset+length-code_store_offset) {
- uint8 opcode = code_store[pointer];
+ uint16 pointer = startOffset - codeStoreOffset;
+ Common::Array<uint32> offsetList;
+ while (pointer < startOffset + length - codeStoreOffset) {
+ uint8 opcode = codeStore[pointer];
pointer += 1;
if (_lingoV4.contains(opcode)) {
- offset_list.push_back(_currentScript->size());
+ offsetList.push_back(_currentScript->size());
g_lingo->code1(_lingoV4[opcode]->func);
size_t argc = strlen(_lingoV4[opcode]->proto);
- for (uint c=0; c<argc; c++) {
+ for (uint c=0; c < argc; c++) {
switch (_lingoV4[opcode]->proto[c]) {
case 'b':
- offset_list.push_back(_currentScript->size());
- g_lingo->codeInt((int8)code_store[pointer]);
+ offsetList.push_back(_currentScript->size());
+ g_lingo->codeInt((int8)codeStore[pointer]);
pointer += 1;
break;
case 'w':
- offset_list.push_back(_currentScript->size());
- offset_list.push_back(_currentScript->size());
- g_lingo->codeInt((int16)READ_UINT16(&code_store[pointer]));
+ offsetList.push_back(_currentScript->size());
+ offsetList.push_back(_currentScript->size());
+ g_lingo->codeInt((int16)READ_UINT16(&codeStore[pointer]));
pointer += 2;
break;
default:
@@ -247,37 +247,33 @@ void Lingo::addCodeV4(Common::SeekableSubReadStreamEndian &stream, ScriptType ty
}
} else {
- // exit condition
- if (opcode == 0x01) {
- offset_list.push_back(_currentScript->size());
- g_lingo->code1(STOP);
// unimplemented instruction
- } else if (opcode < 0x40) { // 1 byte instruction
- offset_list.push_back(_currentScript->size());
+ if (opcode < 0x40) { // 1 byte instruction
+ offsetList.push_back(_currentScript->size());
g_lingo->code1(Lingo::c_unk);
g_lingo->codeInt(opcode);
} else if (opcode < 0x80) { // 2 byte instruction
- offset_list.push_back(_currentScript->size());
+ offsetList.push_back(_currentScript->size());
g_lingo->code1(Lingo::c_unk1);
g_lingo->codeInt(opcode);
- offset_list.push_back(_currentScript->size());
- g_lingo->codeInt((uint)code_store[pointer]);
+ offsetList.push_back(_currentScript->size());
+ g_lingo->codeInt((uint)codeStore[pointer]);
pointer += 1;
} else { // 3 byte instruction
- offset_list.push_back(_currentScript->size());
+ offsetList.push_back(_currentScript->size());
g_lingo->code1(Lingo::c_unk2);
g_lingo->codeInt(opcode);
- offset_list.push_back(_currentScript->size());
- g_lingo->codeInt((uint)code_store[pointer]);
- offset_list.push_back(_currentScript->size());
- g_lingo->codeInt((uint)code_store[pointer+1]);
+ offsetList.push_back(_currentScript->size());
+ g_lingo->codeInt((uint)codeStore[pointer]);
+ offsetList.push_back(_currentScript->size());
+ g_lingo->codeInt((uint)codeStore[pointer+1]);
pointer += 2;
}
}
}
}
- free(code_store);
+ free(codeStore);
}
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 819053f89b..9cfe61397c 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -60,7 +60,7 @@ static struct FuncDescr {
{ Lingo::c_argspush, "c_argspush", "i" },
{ Lingo::c_arraypush, "c_arraypush", "i" },
{ Lingo::c_printtop, "c_printtop", "" },
- { Lingo::c_intpush, "c_intpush", "i" },
+ { Lingo::c_intpush, "c_intpush", "i" },
{ Lingo::c_voidpush, "c_voidpush", "" },
{ Lingo::c_floatpush, "c_floatpush", "f" },
{ Lingo::c_stringpush, "c_stringpush", "s" },
@@ -86,8 +86,8 @@ static struct FuncDescr {
{ Lingo::c_starts, "c_starts", "" },
{ Lingo::c_intersects, "c_intersects", "" },
{ Lingo::c_within, "c_within", "" },
- { Lingo::c_field, "c_field", "" },
- { Lingo::c_of, "c_of", "" }, // D9
+ { Lingo::c_field, "c_field", "" },
+ { Lingo::c_of, "c_of", "" }, // D9
{ Lingo::c_charOf, "c_charOf", "" }, // D3
{ Lingo::c_charToOf, "c_charToOf", "" }, // D3
{ Lingo::c_itemOf, "c_itemOf", "" }, // D3
@@ -110,8 +110,8 @@ static struct FuncDescr {
{ Lingo::c_exitRepeat, "c_exitRepeat", "" },
{ Lingo::c_ifcode, "c_ifcode", "oooi" },
{ Lingo::c_tellcode, "c_tellcode", "o" },
- { Lingo::c_tell, "c_tell", "" },
- { Lingo::c_telldone, "c_telldone", "" },
+ { Lingo::c_tell, "c_tell", "" },
+ { Lingo::c_telldone, "c_telldone", "" },
{ Lingo::c_whencode, "c_whencode", "os" },
{ Lingo::c_goto, "c_goto", "" },
{ Lingo::c_gotoloop, "c_gotoloop", "" },
@@ -125,12 +125,10 @@ static struct FuncDescr {
{ Lingo::c_property, "c_property", "s" },
{ Lingo::c_instance, "c_instance", "s" },
{ Lingo::c_open, "c_open", "" },
- { Lingo::c_hilite, "c_hilite", "" },
- { Lingo::c_jump, "c_jump", "" },
- { Lingo::c_jumpif, "c_jumpif", "" },
- { Lingo::c_unk, "c_unk", "i" },
- { Lingo::c_unk1, "c_unk1", "ii" },
- { Lingo::c_unk2, "c_unk2", "iii" },
+ { Lingo::c_hilite, "c_hilite", "" },
+ { Lingo::c_unk, "c_unk", "i" },
+ { Lingo::c_unk1, "c_unk1", "ii" },
+ { Lingo::c_unk2, "c_unk2", "iii" },
{ 0, 0, 0 }
};
@@ -667,30 +665,30 @@ void Lingo::c_within() {
}
void Lingo::c_field() {
- Datum d1 = g_lingo->pop();
+ Datum d1 = g_lingo->pop();
- warning("STUB: c_field: %d", d1.u.i);
+ warning("STUB: c_field: %d", d1.u.i);
- g_lingo->push(d1);
+ g_lingo->push(d1);
}
void Lingo::c_of() {
- Datum first_char = g_lingo->pop();
- Datum last_char = g_lingo->pop();
- Datum first_word = g_lingo->pop();
- Datum last_word = g_lingo->pop();
- Datum first_item = g_lingo->pop();
- Datum last_item = g_lingo->pop();
- Datum first_line = g_lingo->pop();
- Datum last_line = g_lingo->pop();
- Datum target = g_lingo->pop();
+ Datum first_char = g_lingo->pop();
+ Datum last_char = g_lingo->pop();
+ Datum first_word = g_lingo->pop();
+ Datum last_word = g_lingo->pop();
+ Datum first_item = g_lingo->pop();
+ Datum last_item = g_lingo->pop();
+ Datum first_line = g_lingo->pop();
+ Datum last_line = g_lingo->pop();
+ Datum target = g_lingo->pop();
- warning("STUB: c_of: %d %d %d %d %d %d %d %d %s",
- first_char.u.i, last_char.u.i, first_word.u.i, last_word.u.i,
- first_item.u.i, last_item.u.i, first_line.u.i, last_line.u.i,
- target.u.s->c_str());
+ warning("STUB: c_of: %d %d %d %d %d %d %d %d %s",
+ first_char.u.i, last_char.u.i, first_word.u.i, last_word.u.i,
+ first_item.u.i, last_item.u.i, first_line.u.i, last_line.u.i,
+ target.u.s->c_str());
- g_lingo->push(target);
+ g_lingo->push(target);
}
@@ -1024,7 +1022,7 @@ void Lingo::c_tellcode() {
}
void Lingo::c_tell() {
- Datum d1 = g_lingo->pop();
+ Datum d1 = g_lingo->pop();
warning("STUB: c_tell %d", d1.u.i);
}
@@ -1251,52 +1249,44 @@ void Lingo::c_open() {
}
void Lingo::c_hilite() {
- Datum first_char = g_lingo->pop();
- Datum last_char = g_lingo->pop();
- Datum first_word = g_lingo->pop();
- Datum last_word = g_lingo->pop();
- Datum first_item = g_lingo->pop();
- Datum last_item = g_lingo->pop();
- Datum first_line = g_lingo->pop();
- Datum last_line = g_lingo->pop();
- Datum cast_id = g_lingo->pop();
-
- warning("STUB: c_hilite: %d %d %d %d %d %d %d %d %d",
- first_char.u.i, last_char.u.i, first_word.u.i, last_word.u.i,
- first_item.u.i, last_item.u.i, first_line.u.i, last_line.u.i,
- cast_id.u.i);
-}
-
-void Lingo::c_jump() {
-
-}
-
-void Lingo::c_jumpif() {
-
+ Datum first_char = g_lingo->pop();
+ Datum last_char = g_lingo->pop();
+ Datum first_word = g_lingo->pop();
+ Datum last_word = g_lingo->pop();
+ Datum first_item = g_lingo->pop();
+ Datum last_item = g_lingo->pop();
+ Datum first_line = g_lingo->pop();
+ Datum last_line = g_lingo->pop();
+ Datum cast_id = g_lingo->pop();
+
+ warning("STUB: c_hilite: %d %d %d %d %d %d %d %d %d",
+ first_char.u.i, last_char.u.i, first_word.u.i, last_word.u.i,
+ first_item.u.i, last_item.u.i, first_line.u.i, last_line.u.i,
+ cast_id.u.i);
}
void Lingo::c_unk() {
- int savepc = g_lingo->_pc;
- uint opcode = READ_UINT32(&(*g_lingo->_currentScript)[savepc]);
- warning("STUB: opcode 0x%02x", opcode);
- g_lingo->_pc += 1;
+ int savepc = g_lingo->_pc;
+ uint opcode = READ_UINT32(&(*g_lingo->_currentScript)[savepc]);
+ warning("STUB: opcode 0x%02x", opcode);
+ g_lingo->_pc += 1;
}
void Lingo::c_unk1() {
- int savepc = g_lingo->_pc;
- uint opcode = READ_UINT32(&(*g_lingo->_currentScript)[savepc]);
- uint arg1 = READ_UINT32(&(*g_lingo->_currentScript)[savepc+1]);
- warning("STUB: opcode 0x%02x (%d)", opcode, arg1);
- g_lingo->_pc += 2;
+ int savepc = g_lingo->_pc;
+ uint opcode = READ_UINT32(&(*g_lingo->_currentScript)[savepc]);
+ uint arg1 = READ_UINT32(&(*g_lingo->_currentScript)[savepc+1]);
+ warning("STUB: opcode 0x%02x (%d)", opcode, arg1);
+ g_lingo->_pc += 2;
}
void Lingo::c_unk2() {
- int savepc = g_lingo->_pc;
- uint opcode = READ_UINT32(&(*g_lingo->_currentScript)[savepc]);
- uint arg1 = READ_UINT32(&(*g_lingo->_currentScript)[savepc+1]);
- uint arg2 = READ_UINT32(&(*g_lingo->_currentScript)[savepc+2]);
- warning("STUB: opcode 0x%02x (%d, %d)", opcode, arg1, arg2);
- g_lingo->_pc += 3;
+ int savepc = g_lingo->_pc;
+ uint opcode = READ_UINT32(&(*g_lingo->_currentScript)[savepc]);
+ uint arg1 = READ_UINT32(&(*g_lingo->_currentScript)[savepc+1]);
+ uint arg2 = READ_UINT32(&(*g_lingo->_currentScript)[savepc+2]);
+ warning("STUB: opcode 0x%02x (%d, %d)", opcode, arg1, arg2);
+ g_lingo->_pc += 3;
}
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 71c9bbbb48..70e3edd911 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -151,7 +151,7 @@ asgn: tPUT expr tINTO ID {
delete $2; }
| tSET THEENTITY '=' expr {
g_lingo->code1(g_lingo->c_intpush);
- g_lingo->codeInt(0); // Put dummy id
+ g_lingo->codeInt(0); // Put dummy id
g_lingo->code1(g_lingo->c_theentityassign);
inst e = 0, f = 0;
WRITE_UINT32(&e, $2[0]);
@@ -416,9 +416,9 @@ tell: tTELL {
$$ = g_lingo->code1(g_lingo->c_tellcode);
g_lingo->code1(STOP); }
-expr: INT {
+expr: INT {
$$ = g_lingo->code1(g_lingo->c_intpush);
- g_lingo->codeInt($1); }
+ g_lingo->codeInt($1); }
| FLOAT {
$$ = g_lingo->code1(g_lingo->c_floatpush);
g_lingo->codeFloat($1); }
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index bae1fbb724..7556e90bc2 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -333,9 +333,6 @@ public:
static void c_open();
static void c_hilite();
- static void c_jump();
- static void c_jumpif();
-
// stubs for unknown instructions
static void c_unk();
static void c_unk1();