aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb
diff options
context:
space:
mode:
authorVladimir Menshakov2011-06-16 01:03:00 +0400
committerVladimir Menshakov2011-06-16 01:03:29 +0400
commit14121a6f574299a4d27f5eebe188592be2453cda (patch)
tree24fa38fb1d0fdf56d8474a612d84b352f378240f /engines/dreamweb
parent89f14d38dd947d7f4c6035c843dfeefd60188821 (diff)
downloadscummvm-rg350-14121a6f574299a4d27f5eebe188592be2453cda.tar.gz
scummvm-rg350-14121a6f574299a4d27f5eebe188592be2453cda.tar.bz2
scummvm-rg350-14121a6f574299a4d27f5eebe188592be2453cda.zip
DREAMWEB: moved stubs into stubs.cpp
Diffstat (limited to 'engines/dreamweb')
-rw-r--r--engines/dreamweb/dreamweb.cpp538
-rw-r--r--engines/dreamweb/dreamweb.h2
-rw-r--r--engines/dreamweb/module.mk3
-rw-r--r--engines/dreamweb/stubs.cpp535
4 files changed, 538 insertions, 540 deletions
diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp
index 19bb6b09cb..619f0dddfe 100644
--- a/engines/dreamweb/dreamweb.cpp
+++ b/engines/dreamweb/dreamweb.cpp
@@ -33,8 +33,6 @@
#include "common/timer.h"
#include "common/util.h"
-#include "engines/util.h"
-
#include "audio/mixer.h"
#include "audio/decoders/raw.h"
@@ -327,11 +325,6 @@ void DreamWebEngine::mouseCall() {
_context.flags._c = false;
}
-void DreamWebEngine::setGraphicsMode() {
- processEvents();
- initGraphics(320, 200, false);
-}
-
void DreamWebEngine::fadeDos() {
_context.ds = _context.es = _context.data.word(dreamgen::kBuffers);
return; //fixme later
@@ -568,534 +561,3 @@ void DreamWebEngine::loadSounds(uint bank, const Common::String &filename) {
} // End of namespace DreamWeb
-namespace dreamgen {
-
-Common::String getFilename(Context &context) {
- uint16 name_ptr = context.dx;
- Common::String name;
- uint8 c;
- while((c = context.cs.byte(name_ptr++)) != 0)
- name += (char)c;
- return name;
-}
-
-void multiget(Context &context) {
- unsigned w = (uint8)context.cl, h = (uint8)context.ch;
- unsigned x = (uint16)context.di, y = (uint16)context.bx;
- unsigned src = x + y * kScreenwidth;
- unsigned dst = (uint16)context.si;
- context.es = context.ds;
- context.ds = context.data.word(kWorkspace);
- if (y + h > 200)
- h = 200 - y;
- if (x + w > 320)
- w = 320 - x;
- //debug(1, "multiget %u,%u %ux%u -> segment: %04x->%04x", x, y, w, h, (uint16)context.ds, (uint16)context.es);
- for(unsigned l = 0; l < h; ++l) {
- uint8 *src_p = context.ds.ptr(src + kScreenwidth * l, w);
- uint8 *dst_p = context.es.ptr(dst + w * l, w);
- memcpy(dst_p, src_p, w);
- }
- context.si += w * h;
- context.di = src + kScreenwidth * h;
- context.cx = 0;
-}
-
-void multiput(Context &context) {
- unsigned w = (uint8)context.cl, h = (uint8)context.ch;
- unsigned x = (uint16)context.di, y = (uint16)context.bx;
- unsigned src = (uint16)context.si;
- unsigned dst = x + y * kScreenwidth;
- context.es = context.data.word(kWorkspace);
- if (y + h > 200)
- h = 200 - y;
- if (x + w > 320)
- w = 320 - x;
- //debug(1, "multiput %ux%u -> segment: %04x->%04x", w, h, (uint16)context.ds, (uint16)context.es);
- for(unsigned l = 0; l < h; ++l) {
- uint8 *src_p = context.ds.ptr(src + w * l, w);
- uint8 *dst_p = context.es.ptr(dst + kScreenwidth * l, w);
- memcpy(dst_p, src_p, w);
- }
- context.si += w * h;
- context.di = dst + kScreenwidth * h;
- context.cx = 0;
-}
-
-void multidump(Context &context) {
- context.ds = context.data.word(kWorkspace);
- int w = (uint8)context.cl, h = (uint8)context.ch;
- int x = (int16)context.di, y = (int16)context.bx;
- unsigned offset = x + y * kScreenwidth;
- //debug(1, "multidump %ux%u(segment: %04x) -> %d,%d(address: %d)", w, h, (uint16)context.ds, x, y, offset);
- context.engine->blit(context.ds.ptr(offset, w * h), kScreenwidth, x, y, w, h);
- context.si = context.di = offset + h * kScreenwidth;
- context.cx = 0;
-}
-
-void worktoscreen(Context &context) {
- context.ds = context.data.word(kWorkspace);
- uint size = 320 * 200;
- context.engine->blit(context.ds.ptr(0, size), 320, 0, 0, 320, 200);
- context.di = context.si = size;
- context.cx = 0;
-}
-
-void printundermon(Context &context) {
- context.engine->printUnderMonitor();
-}
-
-void cls(Context &context) {
- context.engine->cls();
-}
-
-void frameoutnm(Context &context) {
- unsigned w = (uint8)context.cl, h = (uint8)context.ch;
- unsigned pitch = (uint16)context.dx;
- unsigned src = (uint16)context.si;
- int x = (uint16)context.di, y = (uint16)context.bx;
- unsigned dst = x + y * pitch;
- //debug(1, "framenm %ux%u[pitch: %u]-> %d,%d, segment: %04x->%04x", w, h, pitch, x, y, (uint16)context.ds, (uint16)context.es);
- for(unsigned l = 0; l < h; ++l) {
- uint8 *src_p = context.ds.ptr(src + w * l, w);
- uint8 *dst_p = context.es.ptr(dst + pitch * l, w);
- memcpy(dst_p, src_p, w);
- }
- context.di += dst + pitch * h;
- context.si += w * h;
- context.cx = 0;
-}
-
-void seecommandtail(Context &context) {
- context.data.word(kSoundbaseadd) = 0x220;
- context.data.byte(kSoundint) = 5;
- context.data.byte(kSounddmachannel) = 1;
- context.data.byte(kBrightness) = 1;
- context.data.word(kHowmuchalloc) = 0x9360;
-}
-
-void randomnumber(Context &context) {
- context.al = context.engine->randomNumber();
-}
-
-void quickquit(Context &context) {
- context.engine->quit();
-}
-
-void quickquit2(Context &context) {
- context.engine->quit();
-}
-
-void keyboardread(Context &context) {
- ::error("keyboardread"); //this keyboard int handler, must never be called
-}
-
-void resetkeyboard(Context &context) {
-}
-
-void setkeyboardint(Context &context) {
-}
-
-void readfromfile(Context &context) {
- uint16 dst_offset = context.dx;
- uint16 size = context.cx;
- debug(1, "readfromfile(%04x:%u, %u)", (uint16)context.ds, dst_offset, size);
- context.ax = context.engine->readFromFile(context.ds.ptr(dst_offset, size), size);
- context.flags._c = false;
-}
-
-void closefile(Context &context) {
- context.engine->closeFile();
- context.data.byte(kHandle) = 0;
-}
-
-void openforsave(Context &context) {
- const char *name = (const char *)context.ds.ptr(context.dx, 13);
- debug(1, "openforsave(%s)", name);
- context.engine->openSaveFileForWriting(name);
-}
-
-void openfilenocheck(Context &context) {
- const char *name = (const char *)context.ds.ptr(context.dx, 13);
- debug(1, "checksavefile(%s)", name);
- bool ok = context.engine->openSaveFileForReading(name);
- context.flags._c = !ok;
-}
-
-void openfilefromc(Context &context) {
- openfilenocheck(context);
-}
-
-void openfile(Context &context) {
- Common::String name = getFilename(context);
- debug(1, "opening file: %s", name.c_str());
- context.engine->openFile(name);
- context.cs.word(kHandle) = 1; //only one handle
- context.flags._c = false;
-}
-
-void createfile(Context &context) {
- ::error("createfile");
-}
-
-void dontloadseg(Context &context) {
- context.ax = context.es.word(context.di);
- context._add(context.di, 2);
- context.dx = context.ax;
- context.cx = 0;
- unsigned pos = context.engine->skipBytes(context.dx);
- context.dx = pos >> 16;
- context.ax = pos & 0xffff;
- context.flags._c = false;
-}
-
-void mousecall(Context &context) {
- context.engine->mouseCall();
-}
-
-void setmouse(Context &context) {
- context.data.word(kOldpointerx) = 0xffff;
- //warning("setmouse: fixme: add range setting");
- //set vertical range to 15-184
- //set horizontal range to 15-298*2
-}
-
-void gettime(Context &context) {
- TimeDate t;
- g_system->getTimeAndDate(t);
- debug(1, "\tgettime: %02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec);
- context.ch = t.tm_hour;
- context.cl = t.tm_min;
- context.dh = t.tm_sec;
- context.data.byte(kSecondcount) = context.dh;
- context.data.byte(kMinutecount) = context.cl;
- context.data.byte(kHourcount) = context.ch;
-}
-
-void allocatemem(Context &context) {
- uint size = (context.bx + 2) * 16;
- debug(1, "allocate mem, %u bytes", size);
- context.flags._c = false;
- SegmentRef seg = context.allocateSegment(size);
- context.ax = (uint16)seg;
- debug(1, "\tsegment address -> %04x", (uint16)context.ax);
-}
-
-void deallocatemem(Context &context) {
- uint16 id = (uint16)context.es;
- debug(1, "deallocating segment %04x", id);
- context.deallocateSegment(id);
-
- //fixing invalid entries in the sprite table
- context.es = context.data;
- uint tsize = 16 * 32;
- uint16 bseg = context.data.word(kBuffers);
- if (!bseg)
- return;
- SegmentRef buffers(&context);
- buffers = bseg;
- uint8 *ptr = buffers.ptr(kSpritetable, tsize);
- for(uint i = 0; i < tsize; i += 32) {
- uint16 seg = READ_LE_UINT16(ptr + i + 6);
- //debug(1, "sprite segment = %04x", seg);
- if (seg == id)
- memset(ptr + i, 0xff, 32);
- }
-}
-
-void removeemm(Context &context) {
- ::error("removeemm");
-}
-
-void setupemm(Context &context) {
- //fixme: double check this, but it seems that emm pages used only for sound
-}
-
-void pitinterupt(Context &context) {
- ::error("pitinterupt");
-}
-
-void getridofpit(Context &context) {
- ::error("getridofpit");
-}
-
-void setuppit(Context &context) {
- ::error("setuppit");
-}
-
-void startdmablock(Context &context) {
- ::error("startdmablock");
-}
-
-void dmaend(Context &context) {
- ::error("dmaend");
-}
-
-void restoreems(Context &context) {
- ::error("restoreems");
-}
-
-void saveems(Context &context) {
- ::error("saveems");
-}
-
-void bothchannels(Context &context) {
- ::error("bothchannels");
-}
-
-void channel1only(Context &context) {
- ::error("channel1only");
-}
-
-void channel0only(Context &context) {
- ::error("channel0only");
-}
-
-void out22c(Context &context) {
- ::error("out22c");
-}
-
-void soundstartup(Context &context) {
-}
-
-void soundend(Context &context) {
-}
-
-void interupttest(Context &context) {
- ::error("interupttest");
-}
-
-void disablesoundint(Context &context) {
- warning("disablesoundint: STUB");
-}
-
-void enablesoundint(Context &context) {
- warning("enablesoundint: STUB");
-}
-
-void checksoundint(Context &context) {
- context.data.byte(kTestresult) = 1;
- warning("checksoundint: STUB");
-}
-
-void setsoundoff(Context &context) {
- warning("setsoundoff: STUB");
-}
-
-void readheader(Context &context);
-
-void loadsample(Context &context) {
- context.engine->loadSounds(0, (const char *)context.data.ptr(context.dx, 13));
-}
-
-void cancelch0(Context &context);
-void cancelch1(Context &context);
-
-void loadsecondsample(Context &context) {
- uint8 ch0 = context.data.byte(kCh0playing);
- if (ch0 >= 12 && ch0 != 255)
- cancelch0(context);
- uint8 ch1 = context.data.byte(kCh1playing);
- if (ch1 >= 12)
- cancelch1(context);
- context.engine->loadSounds(1, (const char *)context.data.ptr(context.dx, 13));
-}
-
-void createname(Context &context);
-
-void loadspeech(Context &context) {
- cancelch1(context);
- context.data.byte(kSpeechloaded) = 0;
- createname(context);
- const char *name = (const char *)context.data.ptr(context.di, 13);
- //warning("name = %s", name);
- if (context.engine->loadSpeech(name))
- context.data.byte(kSpeechloaded) = 1;
-}
-
-void saveseg(Context &context) {
- context.cx = context.es.word(context.di);
- context._add(context.di, 2);
- savefilewrite(context);
-}
-
-void savefilewrite(Context &context) {
- context.ax = context.engine->writeToSaveFile(context.ds.ptr(context.dx, context.cx), context.cx);
-}
-
-void savefileread(Context &context) {
- context.ax = context.engine->readFromSaveFile(context.ds.ptr(context.dx, context.cx), context.cx);
-}
-
-void loadseg(Context &context) {
- context.ax = context.es.word(context.di);
- context.di += 2;
-
- uint16 dst_offset = context.dx;
- uint16 size = context.ax;
-
- debug(1, "loadseg(%04x:%u, %u)", (uint16)context.ds, dst_offset, size);
- context.ax = context.engine->readFromFile(context.ds.ptr(dst_offset, size), size);
- context.flags._c = false;
-}
-
-void error(Context &context) {
- ::error("error");
-}
-
-void generalerror(Context &context) {
- ::error("generalerror");
-}
-
-void commandonly(Context &context);
-
-void dosreturn(Context &context) {
- context._cmp(context.data.byte(kCommandtype), 250);
- if (context.flags.z()) goto alreadydos;
- context.data.byte(kCommandtype) = 250;
- context.al = 46;
- commandonly(context);
-alreadydos:
- context.ax = context.data.word(kMousebutton);
- context._and(context.ax, 1);
- if (context.flags.z()) return;
-
- quickquit2(context);
- quickquit(context);
-}
-
-void set16colpalette(Context &context) {
-}
-
-void mode640x480(Context &context) {
- // Video mode 12h: 640x480 pixels, 16 colors, I believe
- context.al = 0x12 + 128;
- context.ah = 0;
- initGraphics(640, 480, true);
-}
-
-void showgroup(Context &context) {
- context.engine->setPalette();
-}
-
-void fadedos(Context &context) {
- context.engine->fadeDos();
-}
-
-void doshake(Context &context) {
- uint8 &counter = context.data.byte(kShakecounter);
- context._cmp(counter, 48);
- if (context.flags.z())
- return;
-
- context._add(counter, 1);
- static const int shakeTable[] = {
- 0, -2, 3, -2, 0, 2, 4, -1,
- 1, -3, 3, 2, 0, -2, 3, -2,
- 0, 2, 4, -1, 1, -3, 3, 2,
- 0, -2, 3, -2, 0, 2, 4, -1,
-
- 1, -3, 3, 2, 0, -2, 3, -2,
- 0, 2, 4, -1, 1, -3, 3, 2,
- 0, -2, 3, -2, 0, 2, 4, -1,
- 1, -3, 3, 2, 0, -2, 3, -2,
-
- 0, 2, 4, -1, 1, -3, 3, 2,
- 0, -2, 3, -2, 0, 2, 4, -1,
- 1, -3, 3, 2, 0, -2, 3, -2,
- 0, 2, 4, -1, 1, -3, 3, 2,
-
- 0, -2, 3, -2, 0, 2, 4, -1,
- 1, -3, 3, 0,
- };
- int offset = shakeTable[counter];
- context.engine->setShakePos(offset >= 0? offset: -offset);
-}
-
-void vsync(Context &context) {
- context.engine->waitForVSync();
-}
-
-void setmode(Context &context) {
- vsync(context);
- context.engine->setGraphicsMode();
-}
-
-void readoneblock(Context &context) {
- context.ds = context.data.word(kWorkspace);
- context.cx = 30000;
- context.dx = 0;
- readfromfile(context);
-}
-
-void showpcx(Context &context) {
- Common::String name = getFilename(context);
- Common::File pcxFile;
-
- if (!pcxFile.open(name)) {
- warning("showpcx: Could not open '%s'", name.c_str());
- return;
- }
-
- uint8 *maingamepal;
- int i, j;
-
- // Read the 16-color palette into the 'maingamepal' buffer. Note that
- // the color components have to be adjusted from 8 to 6 bits.
-
- pcxFile.seek(16, SEEK_SET);
- context.es = context.data.word(kBuffers);
- maingamepal = context.es.ptr(4782, 768); //fixme: hardcoded offset
- pcxFile.read(maingamepal, 48);
-
- memset(maingamepal + 48, 0xff, 720);
- for (i = 0; i < 48; i++) {
- maingamepal[i] >>= 2;
- }
-
- // Decode the image data.
-
- Graphics::Surface *s = g_system->lockScreen();
- Common::Rect rect(640, 480);
-
- s->fillRect(rect, 0);
- pcxFile.seek(128, SEEK_SET);
-
- for (int y = 0; y < 480; y++) {
- byte *dst = (byte *)s->getBasePtr(0, y);
- int decoded = 0;
-
- while (decoded < 320) {
- byte col = pcxFile.readByte();
- byte len;
-
- if ((col & 0xc0) == 0xc0) {
- len = col & 0x3f;
- col = pcxFile.readByte();
- } else {
- len = 1;
- }
-
- // The image uses 16 colors and is stored as four bit
- // planes, one for each bit of the color, least
- // significant bit plane first.
-
- for (i = 0; i < len; i++) {
- int plane = decoded / 80;
- int pos = decoded % 80;
-
- for (j = 0; j < 8; j++) {
- byte bit = (col >> (7 - j)) & 1;
- dst[8 * pos + j] |= (bit << plane);
- }
-
- decoded++;
- }
- }
- }
-
- g_system->unlockScreen();
- pcxFile.close();
-}
-
-} /*namespace dreamgen */
diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h
index 0f5e5bdc98..9ed02b6283 100644
--- a/engines/dreamweb/dreamweb.h
+++ b/engines/dreamweb/dreamweb.h
@@ -32,6 +32,7 @@
#include "common/rect.h"
#include "common/savefile.h"
#include "common/scummsys.h"
+#include "common/system.h"
#include "audio/audiostream.h"
#include "audio/mixer.h"
@@ -83,7 +84,6 @@ public:
void mouseCall(); //fill mouse pos and button state
void processEvents();
- void setGraphicsMode();
void setPalette();
void fadeDos();
void blit(const uint8 *src, int pitch, int x, int y, int w, int h);
diff --git a/engines/dreamweb/module.mk b/engines/dreamweb/module.mk
index d39270bde6..3b0c7f3325 100644
--- a/engines/dreamweb/module.mk
+++ b/engines/dreamweb/module.mk
@@ -4,7 +4,8 @@ MODULE_OBJS := \
console.o \
detection.o \
dreamweb.o \
- dreamgen.o
+ dreamgen.o \
+ stubs.o
# This module can be built as a plugin
ifeq ($(ENABLE_DREAMWEB), DYNAMIC_PLUGIN)
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
new file mode 100644
index 0000000000..1a6cb7685d
--- /dev/null
+++ b/engines/dreamweb/stubs.cpp
@@ -0,0 +1,535 @@
+#include "dreamweb/dreamweb.h"
+#include "engines/util.h"
+#include "graphics/surface.h"
+
+namespace dreamgen {
+
+Common::String getFilename(Context &context) {
+ uint16 name_ptr = context.dx;
+ Common::String name;
+ uint8 c;
+ while((c = context.cs.byte(name_ptr++)) != 0)
+ name += (char)c;
+ return name;
+}
+
+void multiget(Context &context) {
+ unsigned w = (uint8)context.cl, h = (uint8)context.ch;
+ unsigned x = (uint16)context.di, y = (uint16)context.bx;
+ unsigned src = x + y * kScreenwidth;
+ unsigned dst = (uint16)context.si;
+ context.es = context.ds;
+ context.ds = context.data.word(kWorkspace);
+ if (y + h > 200)
+ h = 200 - y;
+ if (x + w > 320)
+ w = 320 - x;
+ //debug(1, "multiget %u,%u %ux%u -> segment: %04x->%04x", x, y, w, h, (uint16)context.ds, (uint16)context.es);
+ for(unsigned l = 0; l < h; ++l) {
+ uint8 *src_p = context.ds.ptr(src + kScreenwidth * l, w);
+ uint8 *dst_p = context.es.ptr(dst + w * l, w);
+ memcpy(dst_p, src_p, w);
+ }
+ context.si += w * h;
+ context.di = src + kScreenwidth * h;
+ context.cx = 0;
+}
+
+void multiput(Context &context) {
+ unsigned w = (uint8)context.cl, h = (uint8)context.ch;
+ unsigned x = (uint16)context.di, y = (uint16)context.bx;
+ unsigned src = (uint16)context.si;
+ unsigned dst = x + y * kScreenwidth;
+ context.es = context.data.word(kWorkspace);
+ if (y + h > 200)
+ h = 200 - y;
+ if (x + w > 320)
+ w = 320 - x;
+ //debug(1, "multiput %ux%u -> segment: %04x->%04x", w, h, (uint16)context.ds, (uint16)context.es);
+ for(unsigned l = 0; l < h; ++l) {
+ uint8 *src_p = context.ds.ptr(src + w * l, w);
+ uint8 *dst_p = context.es.ptr(dst + kScreenwidth * l, w);
+ memcpy(dst_p, src_p, w);
+ }
+ context.si += w * h;
+ context.di = dst + kScreenwidth * h;
+ context.cx = 0;
+}
+
+void multidump(Context &context) {
+ context.ds = context.data.word(kWorkspace);
+ int w = (uint8)context.cl, h = (uint8)context.ch;
+ int x = (int16)context.di, y = (int16)context.bx;
+ unsigned offset = x + y * kScreenwidth;
+ //debug(1, "multidump %ux%u(segment: %04x) -> %d,%d(address: %d)", w, h, (uint16)context.ds, x, y, offset);
+ context.engine->blit(context.ds.ptr(offset, w * h), kScreenwidth, x, y, w, h);
+ context.si = context.di = offset + h * kScreenwidth;
+ context.cx = 0;
+}
+
+void worktoscreen(Context &context) {
+ context.ds = context.data.word(kWorkspace);
+ uint size = 320 * 200;
+ context.engine->blit(context.ds.ptr(0, size), 320, 0, 0, 320, 200);
+ context.di = context.si = size;
+ context.cx = 0;
+}
+
+void printundermon(Context &context) {
+ context.engine->printUnderMonitor();
+}
+
+void cls(Context &context) {
+ context.engine->cls();
+}
+
+void frameoutnm(Context &context) {
+ unsigned w = (uint8)context.cl, h = (uint8)context.ch;
+ unsigned pitch = (uint16)context.dx;
+ unsigned src = (uint16)context.si;
+ int x = (uint16)context.di, y = (uint16)context.bx;
+ unsigned dst = x + y * pitch;
+ //debug(1, "framenm %ux%u[pitch: %u]-> %d,%d, segment: %04x->%04x", w, h, pitch, x, y, (uint16)context.ds, (uint16)context.es);
+ for(unsigned l = 0; l < h; ++l) {
+ uint8 *src_p = context.ds.ptr(src + w * l, w);
+ uint8 *dst_p = context.es.ptr(dst + pitch * l, w);
+ memcpy(dst_p, src_p, w);
+ }
+ context.di += dst + pitch * h;
+ context.si += w * h;
+ context.cx = 0;
+}
+
+void seecommandtail(Context &context) {
+ context.data.word(kSoundbaseadd) = 0x220;
+ context.data.byte(kSoundint) = 5;
+ context.data.byte(kSounddmachannel) = 1;
+ context.data.byte(kBrightness) = 1;
+ context.data.word(kHowmuchalloc) = 0x9360;
+}
+
+void randomnumber(Context &context) {
+ context.al = context.engine->randomNumber();
+}
+
+void quickquit(Context &context) {
+ context.engine->quit();
+}
+
+void quickquit2(Context &context) {
+ context.engine->quit();
+}
+
+void keyboardread(Context &context) {
+ ::error("keyboardread"); //this keyboard int handler, must never be called
+}
+
+void resetkeyboard(Context &context) {
+}
+
+void setkeyboardint(Context &context) {
+}
+
+void readfromfile(Context &context) {
+ uint16 dst_offset = context.dx;
+ uint16 size = context.cx;
+ debug(1, "readfromfile(%04x:%u, %u)", (uint16)context.ds, dst_offset, size);
+ context.ax = context.engine->readFromFile(context.ds.ptr(dst_offset, size), size);
+ context.flags._c = false;
+}
+
+void closefile(Context &context) {
+ context.engine->closeFile();
+ context.data.byte(kHandle) = 0;
+}
+
+void openforsave(Context &context) {
+ const char *name = (const char *)context.ds.ptr(context.dx, 13);
+ debug(1, "openforsave(%s)", name);
+ context.engine->openSaveFileForWriting(name);
+}
+
+void openfilenocheck(Context &context) {
+ const char *name = (const char *)context.ds.ptr(context.dx, 13);
+ debug(1, "checksavefile(%s)", name);
+ bool ok = context.engine->openSaveFileForReading(name);
+ context.flags._c = !ok;
+}
+
+void openfilefromc(Context &context) {
+ openfilenocheck(context);
+}
+
+void openfile(Context &context) {
+ Common::String name = getFilename(context);
+ debug(1, "opening file: %s", name.c_str());
+ context.engine->openFile(name);
+ context.cs.word(kHandle) = 1; //only one handle
+ context.flags._c = false;
+}
+
+void createfile(Context &context) {
+ ::error("createfile");
+}
+
+void dontloadseg(Context &context) {
+ context.ax = context.es.word(context.di);
+ context._add(context.di, 2);
+ context.dx = context.ax;
+ context.cx = 0;
+ unsigned pos = context.engine->skipBytes(context.dx);
+ context.dx = pos >> 16;
+ context.ax = pos & 0xffff;
+ context.flags._c = false;
+}
+
+void mousecall(Context &context) {
+ context.engine->mouseCall();
+}
+
+void setmouse(Context &context) {
+ context.data.word(kOldpointerx) = 0xffff;
+ //warning("setmouse: fixme: add range setting");
+ //set vertical range to 15-184
+ //set horizontal range to 15-298*2
+}
+
+void gettime(Context &context) {
+ TimeDate t;
+ g_system->getTimeAndDate(t);
+ debug(1, "\tgettime: %02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec);
+ context.ch = t.tm_hour;
+ context.cl = t.tm_min;
+ context.dh = t.tm_sec;
+ context.data.byte(kSecondcount) = context.dh;
+ context.data.byte(kMinutecount) = context.cl;
+ context.data.byte(kHourcount) = context.ch;
+}
+
+void allocatemem(Context &context) {
+ uint size = (context.bx + 2) * 16;
+ debug(1, "allocate mem, %u bytes", size);
+ context.flags._c = false;
+ SegmentRef seg = context.allocateSegment(size);
+ context.ax = (uint16)seg;
+ debug(1, "\tsegment address -> %04x", (uint16)context.ax);
+}
+
+void deallocatemem(Context &context) {
+ uint16 id = (uint16)context.es;
+ debug(1, "deallocating segment %04x", id);
+ context.deallocateSegment(id);
+
+ //fixing invalid entries in the sprite table
+ context.es = context.data;
+ uint tsize = 16 * 32;
+ uint16 bseg = context.data.word(kBuffers);
+ if (!bseg)
+ return;
+ SegmentRef buffers(&context);
+ buffers = bseg;
+ uint8 *ptr = buffers.ptr(kSpritetable, tsize);
+ for(uint i = 0; i < tsize; i += 32) {
+ uint16 seg = READ_LE_UINT16(ptr + i + 6);
+ //debug(1, "sprite segment = %04x", seg);
+ if (seg == id)
+ memset(ptr + i, 0xff, 32);
+ }
+}
+
+void removeemm(Context &context) {
+ ::error("removeemm");
+}
+
+void setupemm(Context &context) {
+ //fixme: double check this, but it seems that emm pages used only for sound
+}
+
+void pitinterupt(Context &context) {
+ ::error("pitinterupt");
+}
+
+void getridofpit(Context &context) {
+ ::error("getridofpit");
+}
+
+void setuppit(Context &context) {
+ ::error("setuppit");
+}
+
+void startdmablock(Context &context) {
+ ::error("startdmablock");
+}
+
+void dmaend(Context &context) {
+ ::error("dmaend");
+}
+
+void restoreems(Context &context) {
+ ::error("restoreems");
+}
+
+void saveems(Context &context) {
+ ::error("saveems");
+}
+
+void bothchannels(Context &context) {
+ ::error("bothchannels");
+}
+
+void channel1only(Context &context) {
+ ::error("channel1only");
+}
+
+void channel0only(Context &context) {
+ ::error("channel0only");
+}
+
+void out22c(Context &context) {
+ ::error("out22c");
+}
+
+void soundstartup(Context &context) {
+}
+
+void soundend(Context &context) {
+}
+
+void interupttest(Context &context) {
+ ::error("interupttest");
+}
+
+void disablesoundint(Context &context) {
+ warning("disablesoundint: STUB");
+}
+
+void enablesoundint(Context &context) {
+ warning("enablesoundint: STUB");
+}
+
+void checksoundint(Context &context) {
+ context.data.byte(kTestresult) = 1;
+ warning("checksoundint: STUB");
+}
+
+void setsoundoff(Context &context) {
+ warning("setsoundoff: STUB");
+}
+
+void readheader(Context &context);
+
+void loadsample(Context &context) {
+ context.engine->loadSounds(0, (const char *)context.data.ptr(context.dx, 13));
+}
+
+void cancelch0(Context &context);
+void cancelch1(Context &context);
+
+void loadsecondsample(Context &context) {
+ uint8 ch0 = context.data.byte(kCh0playing);
+ if (ch0 >= 12 && ch0 != 255)
+ cancelch0(context);
+ uint8 ch1 = context.data.byte(kCh1playing);
+ if (ch1 >= 12)
+ cancelch1(context);
+ context.engine->loadSounds(1, (const char *)context.data.ptr(context.dx, 13));
+}
+
+void createname(Context &context);
+
+void loadspeech(Context &context) {
+ cancelch1(context);
+ context.data.byte(kSpeechloaded) = 0;
+ createname(context);
+ const char *name = (const char *)context.data.ptr(context.di, 13);
+ //warning("name = %s", name);
+ if (context.engine->loadSpeech(name))
+ context.data.byte(kSpeechloaded) = 1;
+}
+
+void saveseg(Context &context) {
+ context.cx = context.es.word(context.di);
+ context._add(context.di, 2);
+ savefilewrite(context);
+}
+
+void savefilewrite(Context &context) {
+ context.ax = context.engine->writeToSaveFile(context.ds.ptr(context.dx, context.cx), context.cx);
+}
+
+void savefileread(Context &context) {
+ context.ax = context.engine->readFromSaveFile(context.ds.ptr(context.dx, context.cx), context.cx);
+}
+
+void loadseg(Context &context) {
+ context.ax = context.es.word(context.di);
+ context.di += 2;
+
+ uint16 dst_offset = context.dx;
+ uint16 size = context.ax;
+
+ debug(1, "loadseg(%04x:%u, %u)", (uint16)context.ds, dst_offset, size);
+ context.ax = context.engine->readFromFile(context.ds.ptr(dst_offset, size), size);
+ context.flags._c = false;
+}
+
+void error(Context &context) {
+ ::error("error");
+}
+
+void generalerror(Context &context) {
+ ::error("generalerror");
+}
+
+void commandonly(Context &context);
+
+void dosreturn(Context &context) {
+ context._cmp(context.data.byte(kCommandtype), 250);
+ if (context.flags.z()) goto alreadydos;
+ context.data.byte(kCommandtype) = 250;
+ context.al = 46;
+ commandonly(context);
+alreadydos:
+ context.ax = context.data.word(kMousebutton);
+ context._and(context.ax, 1);
+ if (context.flags.z()) return;
+
+ quickquit2(context);
+ quickquit(context);
+}
+
+void set16colpalette(Context &context) {
+}
+
+void mode640x480(Context &context) {
+ // Video mode 12h: 640x480 pixels, 16 colors, I believe
+ context.al = 0x12 + 128;
+ context.ah = 0;
+ initGraphics(640, 480, true);
+}
+
+void showgroup(Context &context) {
+ context.engine->setPalette();
+}
+
+void fadedos(Context &context) {
+ context.engine->fadeDos();
+}
+
+void doshake(Context &context) {
+ uint8 &counter = context.data.byte(kShakecounter);
+ context._cmp(counter, 48);
+ if (context.flags.z())
+ return;
+
+ context._add(counter, 1);
+ static const int shakeTable[] = {
+ 0, -2, 3, -2, 0, 2, 4, -1,
+ 1, -3, 3, 2, 0, -2, 3, -2,
+ 0, 2, 4, -1, 1, -3, 3, 2,
+ 0, -2, 3, -2, 0, 2, 4, -1,
+
+ 1, -3, 3, 2, 0, -2, 3, -2,
+ 0, 2, 4, -1, 1, -3, 3, 2,
+ 0, -2, 3, -2, 0, 2, 4, -1,
+ 1, -3, 3, 2, 0, -2, 3, -2,
+
+ 0, 2, 4, -1, 1, -3, 3, 2,
+ 0, -2, 3, -2, 0, 2, 4, -1,
+ 1, -3, 3, 2, 0, -2, 3, -2,
+ 0, 2, 4, -1, 1, -3, 3, 2,
+
+ 0, -2, 3, -2, 0, 2, 4, -1,
+ 1, -3, 3, 0,
+ };
+ int offset = shakeTable[counter];
+ context.engine->setShakePos(offset >= 0? offset: -offset);
+}
+
+void vsync(Context &context) {
+ context.engine->waitForVSync();
+}
+
+void setmode(Context &context) {
+ vsync(context);
+ initGraphics(320, 200, false);
+}
+
+void readoneblock(Context &context) {
+ context.ds = context.data.word(kWorkspace);
+ context.cx = 30000;
+ context.dx = 0;
+ readfromfile(context);
+}
+
+void showpcx(Context &context) {
+ Common::String name = getFilename(context);
+ Common::File pcxFile;
+
+ if (!pcxFile.open(name)) {
+ warning("showpcx: Could not open '%s'", name.c_str());
+ return;
+ }
+
+ uint8 *maingamepal;
+ int i, j;
+
+ // Read the 16-color palette into the 'maingamepal' buffer. Note that
+ // the color components have to be adjusted from 8 to 6 bits.
+
+ pcxFile.seek(16, SEEK_SET);
+ context.es = context.data.word(kBuffers);
+ maingamepal = context.es.ptr(4782, 768); //fixme: hardcoded offset
+ pcxFile.read(maingamepal, 48);
+
+ memset(maingamepal + 48, 0xff, 720);
+ for (i = 0; i < 48; i++) {
+ maingamepal[i] >>= 2;
+ }
+
+ // Decode the image data.
+
+ Graphics::Surface *s = g_system->lockScreen();
+ Common::Rect rect(640, 480);
+
+ s->fillRect(rect, 0);
+ pcxFile.seek(128, SEEK_SET);
+
+ for (int y = 0; y < 480; y++) {
+ byte *dst = (byte *)s->getBasePtr(0, y);
+ int decoded = 0;
+
+ while (decoded < 320) {
+ byte col = pcxFile.readByte();
+ byte len;
+
+ if ((col & 0xc0) == 0xc0) {
+ len = col & 0x3f;
+ col = pcxFile.readByte();
+ } else {
+ len = 1;
+ }
+
+ // The image uses 16 colors and is stored as four bit
+ // planes, one for each bit of the color, least
+ // significant bit plane first.
+
+ for (i = 0; i < len; i++) {
+ int plane = decoded / 80;
+ int pos = decoded % 80;
+
+ for (j = 0; j < 8; j++) {
+ byte bit = (col >> (7 - j)) & 1;
+ dst[8 * pos + j] |= (bit << plane);
+ }
+
+ decoded++;
+ }
+ }
+ }
+
+ g_system->unlockScreen();
+ pcxFile.close();
+}
+
+} /*namespace dreamgen */