diff options
Diffstat (limited to 'engines/sci/engine/kmisc.cpp')
-rw-r--r-- | engines/sci/engine/kmisc.cpp | 89 |
1 files changed, 52 insertions, 37 deletions
diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 6e961f72f3..907e0ba2e4 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -151,8 +151,13 @@ reg_t kMemorySegment(EngineState *s, int argc, reg_t *argv) { if (!size) size = s->_segMan->strlen(argv[1]) + 1; - if (size > EngineState::kMemorySegmentMax) - size = EngineState::kMemorySegmentMax; + if (size > EngineState::kMemorySegmentMax) { + // This was set to cut the block to 256 bytes. This should be an + // error, as we won't restore the full block that the game scripts + // request, thus error out instead. + //size = EngineState::kMemorySegmentMax; + error("kMemorySegment: Requested to save more than 256 bytes (%d)", size); + } s->_memorySegmentSize = size; @@ -298,12 +303,9 @@ reg_t kMemory(EngineState *s, int argc, reg_t *argv) { error("Attempt to peek invalid memory at %04x:%04x", PRINT_REG(argv[1])); return s->r_acc; } - if (ref.isRaw) { - if (g_sci->getPlatform() == Common::kPlatformAmiga) - return make_reg(0, (int16)READ_BE_UINT16(ref.raw)); // Amiga versions are BE - else - return make_reg(0, (int16)READ_LE_UINT16(ref.raw)); - } else { + if (ref.isRaw) + return make_reg(0, (int16)READ_SCIENDIAN_UINT16(ref.raw)); + else { if (ref.skipByte) error("Attempt to peek memory at odd offset %04X:%04X", PRINT_REG(argv[1])); return *(ref.reg); @@ -323,10 +325,7 @@ reg_t kMemory(EngineState *s, int argc, reg_t *argv) { error("Attempt to poke memory reference %04x:%04x to %04x:%04x", PRINT_REG(argv[2]), PRINT_REG(argv[1])); return s->r_acc; } - if (g_sci->getPlatform() == Common::kPlatformAmiga) - WRITE_BE_UINT16(ref.raw, argv[2].offset); // Amiga versions are BE - else - WRITE_LE_UINT16(ref.raw, argv[2].offset); + WRITE_SCIENDIAN_UINT16(ref.raw, argv[2].offset); // Amiga versions are BE } else { if (ref.skipByte) error("Attempt to poke memory at odd offset %04X:%04X", PRINT_REG(argv[1])); @@ -362,22 +361,32 @@ reg_t kIconBar(EngineState *s, int argc, reg_t *argv) { return NULL_REG; switch (argv[0].toUint16()) { - case 0: - // Add the icons + case 0: // InitIconBar for (int i = 0; i < argv[1].toUint16(); i++) g_sci->_gfxMacIconBar->addIcon(argv[i + 2]); - - g_sci->_gfxMacIconBar->drawIcons(); break; - case 2: - case 3: - case 4: - // TODO: Other calls seem to handle selecting/deselecting them + case 1: // DisposeIconBar + warning("kIconBar(Dispose)"); + break; + case 2: // EnableIconBar (-1 = all) + debug(0, "kIconBar(Enable, %i)", argv[1].toSint16()); + g_sci->_gfxMacIconBar->setIconEnabled(argv[1].toSint16(), true); + break; + case 3: // DisableIconBar (-1 = all) + debug(0, "kIconBar(Disable, %i)", argv[1].toSint16()); + g_sci->_gfxMacIconBar->setIconEnabled(argv[1].toSint16(), false); + break; + case 4: // SetIconBarIcon + debug(0, "kIconBar(SetIcon, %d, %d)", argv[1].toUint16(), argv[2].toUint16()); + if (argv[2].toSint16() == -1) + g_sci->_gfxMacIconBar->setInventoryIcon(argv[2].toSint16()); break; default: - warning("Unknown kIconBar subop %d", argv[0].toUint16()); + error("Unknown kIconBar(%d)", argv[0].toUint16()); } + g_sci->_gfxMacIconBar->drawIcons(); + return NULL_REG; } @@ -389,23 +398,28 @@ reg_t kMacPlatform(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { case 0: - // Set Mac cursor remap - g_sci->_gfxCursor->setMacCursorRemapList(argc - 1, argv + 1); - break; - case 1: - // Unknown + // Subop 0 has changed a few times + // In SCI1, its usage is still unknown + // In SCI1.1, it's NOP + // In SCI32, it's used for remapping cursor ID's + if (getSciVersion() >= SCI_VERSION_2_1) // Set Mac cursor remap + g_sci->_gfxCursor->setMacCursorRemapList(argc - 1, argv + 1); + else if (getSciVersion() != SCI_VERSION_1_1) + warning("Unknown SCI1 kMacPlatform(0) call"); break; - case 2: - // Unknown - break; - case 3: - // Unknown - break; - case 4: - // Handle icon bar code + case 4: // Handle icon bar code return kIconBar(s, argc - 1, argv + 1); + case 7: // Unknown, but always return -1 + return SIGNAL_REG; + case 1: // Unknown, calls QuickDraw region functions (KQ5, QFG1VGA) + case 2: // Unknown, "UseNextWaitEvent" (Various) + case 3: // Unknown, "ProcessOpenDocuments" (Various) + case 5: // Unknown, plays a sound (KQ7) + case 6: // Unknown, menu-related (Unused?) + warning("Unhandled kMacPlatform(%d)", argv[0].toUint16()); + break; default: - warning("Unknown kMacPlatform subop %d", argv[0].toUint16()); + error("Unknown kMacPlatform(%d)", argv[0].toUint16()); } return s->r_acc; @@ -455,7 +469,8 @@ reg_t kPlatform(EngineState *s, int argc, reg_t *argv) { warning("STUB: kPlatform(CDCheck)"); break; case kPlatformUnk0: - if (g_sci->getPlatform() == Common::kPlatformMacintosh && getSciVersion() >= SCI_VERSION_1_1 && argc > 1) + // For Mac versions, kPlatform(0) with other args has more functionality + if (g_sci->getPlatform() == Common::kPlatformMacintosh && argc > 1) return kMacPlatform(s, argc - 1, argv + 1); // Otherwise, fall through case kPlatformGetPlatform: @@ -486,7 +501,7 @@ reg_t kStub(EngineState *s, int argc, reg_t *argv) { Kernel *kernel = g_sci->getKernel(); int kernelCallNr = -1; - Common::List<ExecStack>::iterator callIterator = s->_executionStack.end(); + Common::List<ExecStack>::const_iterator callIterator = s->_executionStack.end(); if (callIterator != s->_executionStack.begin()) { callIterator--; ExecStack lastCall = *callIterator; |