diff options
author | Vladimir Menshakov | 2011-06-16 01:03:00 +0400 |
---|---|---|
committer | Vladimir Menshakov | 2011-06-16 01:03:29 +0400 |
commit | 14121a6f574299a4d27f5eebe188592be2453cda (patch) | |
tree | 24fa38fb1d0fdf56d8474a612d84b352f378240f /engines | |
parent | 89f14d38dd947d7f4c6035c843dfeefd60188821 (diff) | |
download | scummvm-rg350-14121a6f574299a4d27f5eebe188592be2453cda.tar.gz scummvm-rg350-14121a6f574299a4d27f5eebe188592be2453cda.tar.bz2 scummvm-rg350-14121a6f574299a4d27f5eebe188592be2453cda.zip |
DREAMWEB: moved stubs into stubs.cpp
Diffstat (limited to 'engines')
-rw-r--r-- | engines/dreamweb/dreamweb.cpp | 538 | ||||
-rw-r--r-- | engines/dreamweb/dreamweb.h | 2 | ||||
-rw-r--r-- | engines/dreamweb/module.mk | 3 | ||||
-rw-r--r-- | engines/dreamweb/stubs.cpp | 535 |
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 */ |