/* PLEASE DO NOT MODIFY THIS FILE. ALL CHANGES WILL BE LOST! LOOK FOR README FOR DETAILS */ /* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "dreamgen.h" namespace DreamGen { void DreamGenContext::receptionist() { STACK_CHECK; checkSpeed(); if (!flags.z()) goto gotrecep; _cmp(data.byte(kCardpassflag), 1); if (!flags.z()) goto notsetcard; _inc(data.byte(kCardpassflag)); es.byte(bx+7) = 1; es.word(bx+3) = 64; notsetcard: _cmp(es.word(bx+3), 58); if (!flags.z()) goto notdes1; randomNumber(); _cmp(al, 30); if (flags.c()) goto notdes2; es.word(bx+3) = 55; goto gotrecep; notdes1: _cmp(es.word(bx+3), 60); if (!flags.z()) goto notdes2; randomNumber(); _cmp(al, 240); if (flags.c()) goto gotrecep; es.word(bx+3) = 53; goto gotrecep; notdes2: _cmp(es.word(bx+3), 88); if (!flags.z()) goto notendcard; es.word(bx+3) = 53; goto gotrecep; notendcard: _inc(es.word(bx+3)); gotrecep: showGameReel(); addToPeopleList(); al = es.byte(bx+7); _and(al, 128); if (flags.z()) return /* (nottalkedrecep) */; data.byte(kTalkedtorecep) = 1; } void DreamGenContext::bartender() { STACK_CHECK; checkSpeed(); if (!flags.z()) goto gotsmoket; _cmp(es.word(bx+3), 86); if (!flags.z()) goto notsmoket1; randomNumber(); _cmp(al, 18); if (flags.c()) goto notsmoket2; es.word(bx+3) = 81; goto gotsmoket; notsmoket1: _cmp(es.word(bx+3), 103); if (!flags.z()) goto notsmoket2; es.word(bx+3) = 81; goto gotsmoket; notsmoket2: _inc(es.word(bx+3)); gotsmoket: showGameReel(); _cmp(data.byte(kGunpassflag), 1); if (!flags.z()) goto notgotgun; es.byte(bx+7) = 9; notgotgun: addToPeopleList(); } void DreamGenContext::helicopter() { STACK_CHECK; ax = es.word(bx+3); _cmp(ax, 203); if (flags.z()) goto heliwon; checkSpeed(); if (!flags.z()) goto helispeed; ax = es.word(bx+3); _inc(ax); _cmp(ax, 53); if (!flags.z()) goto notbeforehdead; _inc(data.byte(kCombatcount)); _cmp(data.byte(kCombatcount), 8); if (flags.c()) goto waitabit; data.byte(kMandead) = 2; waitabit: ax = 49; goto gotheliframe; notbeforehdead: _cmp(ax, 9); if (!flags.z()) goto gotheliframe; _dec(ax); _cmp(data.byte(kLastweapon), 1); if (!flags.z()) goto notgunonheli; data.byte(kLastweapon) = -1; ax = 55; goto gotheliframe; notgunonheli: ax = 5; _inc(data.byte(kCombatcount)); _cmp(data.byte(kCombatcount), 20); if (!flags.z()) goto gotheliframe; data.byte(kCombatcount) = 0; ax = 9; gotheliframe: es.word(bx+3) = ax; helispeed: showGameReel(); al = data.byte(kMapx); es.byte(bx+1) = al; ax = es.word(bx+3); _cmp(ax, 9); if (!flags.c()) goto notwaitingheli; _cmp(data.byte(kCombatcount), 7); if (flags.c()) goto notwaitingheli; data.byte(kPointermode) = 2; data.word(kWatchingtime) = 0; return; notwaitingheli: data.byte(kPointermode) = 0; data.word(kWatchingtime) = 2; return; heliwon: data.byte(kPointermode) = 0; } void DreamGenContext::mugger() { STACK_CHECK; ax = es.word(bx+3); _cmp(ax, 138); if (flags.z()) goto endmugger1; _cmp(ax, 176); if (flags.z()) return /* (endmugger2) */; _cmp(ax, 2); if (!flags.z()) goto havesetwatch; data.word(kWatchingtime) = 175*2; havesetwatch: checkSpeed(); if (!flags.z()) goto notmugger; _inc(es.word(bx+3)); notmugger: showGameReel(); al = data.byte(kMapx); es.byte(bx+1) = al; return; endmugger1: push(es); push(bx); createPanel2(); showIcon(); al = 41; findPuzText(); di = 33+20; bx = 104; dl = 241; ah = 0; printDirect(); workToScreen(); cx = 300; hangOn(); bx = pop(); es = pop(); push(es); push(bx); es.word(bx+3) = 140; data.byte(kManspath) = 2; data.byte(kFinaldest) = 2; findXYFromPath(); data.byte(kResetmanxy) = 1; al = 'W'; ah = 'E'; cl = 'T'; ch = 'A'; findExObject(); data.byte(kCommand) = al; data.byte(kObjecttype) = 4; removeObFromInv(); al = 'W'; ah = 'E'; cl = 'T'; ch = 'B'; findExObject(); data.byte(kCommand) = al; data.byte(kObjecttype) = 4; removeObFromInv(); makeMainScreen(); al = 48; bl = 68-32; bh = 54+64; cx = 70; dx = 10; setupTimedUse(); data.byte(kBeenmugged) = 1; bx = pop(); es = pop(); } void DreamGenContext::businessMan() { STACK_CHECK; data.byte(kPointermode) = 0; data.word(kWatchingtime) = 2; ax = es.word(bx+3); _cmp(ax, 2); if (!flags.z()) goto notfirstbiz; push(ax); push(bx); push(es); al = 49; cx = 30; dx = 1; bl = 68; bh = 174; setupTimedUse(); es = pop(); bx = pop(); ax = pop(); notfirstbiz: _cmp(ax, 95); if (flags.z()) goto buscombatwonend; _cmp(ax, 49); if (flags.z()) return /* (buscombatend) */; checkSpeed(); if (!flags.z()) goto busspeed; ax = es.word(bx+3); _inc(ax); _cmp(ax, 48); if (!flags.z()) goto notbeforedeadb; data.byte(kMandead) = 2; goto gotbusframe; notbeforedeadb: _cmp(ax, 15); if (!flags.z()) goto buscombatwon; _dec(ax); _cmp(data.byte(kLastweapon), 3); if (!flags.z()) goto notshieldonbus; data.byte(kLastweapon) = -1; data.byte(kCombatcount) = 0; ax = 51; goto gotbusframe; notshieldonbus: _inc(data.byte(kCombatcount)); _cmp(data.byte(kCombatcount), 20); if (!flags.z()) goto gotbusframe; data.byte(kCombatcount) = 0; ax = 15; goto gotbusframe; buscombatwon: _cmp(ax, 91); if (!flags.z()) goto gotbusframe; push(bx); push(es); al = 0; turnPathOn(); al = 1; turnPathOn(); al = 2; turnPathOn(); al = 3; turnPathOff(); data.byte(kManspath) = 5; data.byte(kFinaldest) = 5; findXYFromPath(); data.byte(kResetmanxy) = 1; es = pop(); bx = pop(); ax = 92; goto gotbusframe; gotbusframe: es.word(bx+3) = ax; busspeed: showGameReel(); al = data.byte(kMapy); es.byte(bx+2) = al; ax = es.word(bx+3); _cmp(ax, 14); if (!flags.z()) return /* (buscombatend) */; data.word(kWatchingtime) = 0; data.byte(kPointermode) = 2; return; buscombatwonend: data.byte(kPointermode) = 0; data.word(kWatchingtime) = 0; } void DreamGenContext::poolGuard() { STACK_CHECK; ax = es.word(bx+3); _cmp(ax, 214); if (flags.z()) goto combatover2; _cmp(ax, 258); if (flags.z()) goto combatover2; _cmp(ax, 185); if (flags.z()) goto combatover1; _cmp(ax, 0); if (!flags.z()) goto notfirstpool; al = 0; turnPathOn(); notfirstpool: checkSpeed(); if (!flags.z()) goto guardspeed; ax = es.word(bx+3); _inc(ax); _cmp(ax, 122); if (!flags.z()) goto notendguard1; _dec(ax); _cmp(data.byte(kLastweapon), 2); if (!flags.z()) goto notaxeonpool; data.byte(kLastweapon) = -1; ax = 122; goto gotguardframe; notaxeonpool: _inc(data.byte(kCombatcount)); _cmp(data.byte(kCombatcount), 40); if (!flags.z()) goto gotguardframe; data.byte(kCombatcount) = 0; ax = 195; goto gotguardframe; notendguard1: _cmp(ax, 147); if (!flags.z()) goto gotguardframe; _dec(ax); _cmp(data.byte(kLastweapon), 1); if (!flags.z()) goto notgunonpool; data.byte(kLastweapon) = -1; ax = 147; goto gotguardframe; notgunonpool: _inc(data.byte(kCombatcount)); _cmp(data.byte(kCombatcount), 40); if (!flags.z()) goto gotguardframe; data.byte(kCombatcount) = 0; ax = 220; gotguardframe: es.word(bx+3) = ax; guardspeed: showGameReel(); ax = es.word(bx+3); _cmp(ax, 121); if (flags.z()) goto iswaitingpool; _cmp(ax, 146); if (flags.z()) goto iswaitingpool; data.byte(kPointermode) = 0; data.word(kWatchingtime) = 2; return; iswaitingpool: data.byte(kPointermode) = 2; data.word(kWatchingtime) = 0; return; combatover1: data.word(kWatchingtime) = 0; data.byte(kPointermode) = 0; al = 0; turnPathOn(); al = 1; turnPathOff(); return; combatover2: showGameReel(); data.word(kWatchingtime) = 2; data.byte(kPointermode) = 0; _inc(data.byte(kCombatcount)); _cmp(data.byte(kCombatcount), 100); if (flags.c()) return /* (doneover2) */; data.word(kWatchingtime) = 0; data.byte(kMandead) = 2; } void DreamGenContext::heavy() { STACK_CHECK; al = es.byte(bx+7); _and(al, 127); es.byte(bx+7) = al; _cmp(es.word(bx+3), 43); if (flags.z()) goto heavywait; data.word(kWatchingtime) = 10; _cmp(es.word(bx+3), 70); if (!flags.z()) goto notafterhshot; _inc(data.byte(kCombatcount)); _cmp(data.byte(kCombatcount), 80); if (!flags.z()) goto gotheavyframe; data.byte(kMandead) = 2; goto gotheavyframe; notafterhshot: checkSpeed(); if (!flags.z()) goto gotheavyframe; _inc(es.word(bx+3)); goto gotheavyframe; heavywait: _cmp(data.byte(kLastweapon), 1); if (!flags.z()) goto gotheavyframe; _cmp(data.byte(kManspath), 5); if (!flags.z()) goto gotheavyframe; _cmp(data.byte(kFacing), 4); if (!flags.z()) goto gotheavyframe; data.byte(kLastweapon) = -1; _inc(es.word(bx+3)); data.byte(kCombatcount) = 0; gotheavyframe: showGameReel(); addToPeopleList(); } void DreamGenContext::endGameSeq() { STACK_CHECK; checkSpeed(); if (!flags.z()) goto notendseq; ax = es.word(bx+3); _inc(ax); _cmp(ax, 51); if (!flags.z()) goto gotendseq; _cmp(data.byte(kIntrocount), 140); if (flags.z()) goto gotendseq; _inc(data.byte(kIntrocount)); push(es); push(bx); textForEnd(); bx = pop(); es = pop(); ax = 50; gotendseq: es.word(bx+3) = ax; _cmp(ax, 134); if (!flags.z()) goto notfadedown; push(es); push(bx); push(ax); fadeScreenDownHalf(); ax = pop(); bx = pop(); es = pop(); goto notendseq; notfadedown: _cmp(ax, 324); if (!flags.z()) goto notfadeend; push(es); push(bx); push(ax); fadeScreenDowns(); data.byte(kVolumeto) = 7; data.byte(kVolumedirection) = 1; ax = pop(); bx = pop(); es = pop(); notfadeend: _cmp(ax, 340); if (!flags.z()) goto notendseq; data.byte(kGetback) = 1; notendseq: showGameReel(); al = data.byte(kMapy); es.byte(bx+2) = al; ax = es.word(bx+3); _cmp(ax, 145); if (!flags.z()) return /* (notendcreds) */; es.word(bx+3) = 146; rollEndCredits(); } void DreamGenContext::checkForExit() { STACK_CHECK; cl = data.byte(kRyanx); _add(cl, 12); ch = data.byte(kRyany); _add(ch, 12); checkOne(); data.byte(kLastflag) = cl; data.byte(kLastflagex) = ch; data.byte(kFlagx) = dl; data.byte(kFlagy) = dh; al = data.byte(kLastflag); _test(al, 64); if (flags.z()) goto notnewdirect; al = data.byte(kLastflagex); data.byte(kAutolocation) = al; return; notnewdirect: _test(al, 32); if (flags.z()) goto notleave; push(es); push(bx); _cmp(data.byte(kReallocation), 2); if (!flags.z()) goto notlouis; bl = 0; push(bx); al = 'W'; ah = 'E'; cl = 'T'; ch = 'A'; isRyanHolding(); bx = pop(); if (flags.z()) goto noshoe1; _inc(bl); noshoe1: push(bx); al = 'W'; ah = 'E'; cl = 'T'; ch = 'B'; isRyanHolding(); bx = pop(); if (flags.z()) goto noshoe2; _inc(bl); noshoe2: _cmp(bl, 2); if (flags.z()) goto notlouis; al = 42; _cmp(bl, 0); if (flags.z()) goto notravmessage; _inc(al); notravmessage: cx = 80; dx = 10; bl = 68; bh = 64; setupTimedUse(); al = data.byte(kFacing); _add(al, 4); _and(al, 7); data.byte(kTurntoface) = al; bx = pop(); es = pop(); return; notlouis: bx = pop(); es = pop(); data.byte(kNeedtotravel) = 1; return; notleave: _test(al, 4); if (flags.z()) goto notaleft; adjustLeft(); return; notaleft: _test(al, 2); if (flags.z()) goto notaright; adjustRight(); return; notaright: _test(al, 8); if (flags.z()) goto notadown; adjustDown(); return; notadown: _test(al, 16); if (flags.z()) return /* (notanup) */; adjustUp(); } void DreamGenContext::adjustDown() { STACK_CHECK; push(es); push(bx); _add(data.byte(kMapy), 10); al = data.byte(kLastflagex); cl = 16; _mul(cl); es.byte(bx+11) = al; data.byte(kNowinnewroom) = 1; bx = pop(); es = pop(); } void DreamGenContext::adjustUp() { STACK_CHECK; push(es); push(bx); _sub(data.byte(kMapy), 10); al = data.byte(kLastflagex); cl = 16; _mul(cl); es.byte(bx+11) = al; data.byte(kNowinnewroom) = 1; bx = pop(); es = pop(); } void DreamGenContext::adjustLeft() { STACK_CHECK; push(es); push(bx); data.byte(kLastflag) = 0; _sub(data.byte(kMapx), 11); al = data.byte(kLastflagex); cl = 16; _mul(cl); es.byte(bx+10) = al; data.byte(kNowinnewroom) = 1; bx = pop(); es = pop(); } void DreamGenContext::adjustRight() { STACK_CHECK; push(es); push(bx); _add(data.byte(kMapx), 11); al = data.byte(kLastflagex); cl = 16; _mul(cl); _sub(al, 2); es.byte(bx+10) = al; data.byte(kNowinnewroom) = 1; bx = pop(); es = pop(); } void DreamGenContext::reminders() { STACK_CHECK; _cmp(data.byte(kReallocation), 24); if (!flags.z()) return /* (notinedenslift) */; _cmp(data.byte(kMapx), 44); if (!flags.z()) return /* (notinedenslift) */; _cmp(data.byte(kProgresspoints), 0); if (!flags.z()) return /* (notfirst) */; al = 'D'; ah = 'K'; cl = 'E'; ch = 'Y'; isRyanHolding(); if (flags.z()) goto forgotone; al = 'C'; ah = 'S'; cl = 'H'; ch = 'R'; findExObject(); _cmp(al, (114)); if (flags.z()) goto forgotone; ax = es.word(bx+2); _cmp(al, 4); if (!flags.z()) goto forgotone; _cmp(ah, 255); if (flags.z()) goto havegotcard; cl = 'P'; ch = 'U'; dl = 'R'; dh = 'S'; _xchg(al, ah); compare(); if (!flags.z()) goto forgotone; havegotcard: _inc(data.byte(kProgresspoints)); return; forgotone: al = 50; bl = 54; bh = 70; cx = 48; dx = 8; setupTimedUse(); } void DreamGenContext::transferMap() { STACK_CHECK; di = data.word(kExframepos); push(di); al = data.byte(kExpos); ah = 0; bx = ax; _add(ax, ax); _add(ax, bx); cx = 6; _mul(cx); es = data.word(kExtras); bx = (0); _add(bx, ax); _add(di, (0+2080)); push(bx); al = data.byte(kItemtotran); ah = 0; bx = ax; _add(ax, ax); _add(ax, bx); cx = 6; _mul(cx); ds = data.word(kFreeframes); bx = (0); _add(bx, ax); si = (0+2080); al = ds.byte(bx); ah = 0; cl = ds.byte(bx+1); ch = 0; _add(si, ds.word(bx+2)); dx = ds.word(bx+4); bx = pop(); es.byte(bx+0) = al; es.byte(bx+1) = cl; es.word(bx+4) = dx; _mul(cx); cx = ax; push(cx); _movsb(cx, true); cx = pop(); ax = pop(); es.word(bx+2) = ax; _add(data.word(kExframepos), cx); } void DreamGenContext::fadeScreenDownHalf() { STACK_CHECK; palToStartPal(); palToEndPal(); cx = 768; es = data.word(kBuffers); bx = (0+(228*13)+32+60+(32*32)+(11*10*3)+768); halfend: al = es.byte(bx); _shr(al, 1); es.byte(bx) = al; _inc(bx); if (--cx) goto halfend; ds = data.word(kBuffers); es = data.word(kBuffers); si = (0+(228*13)+32+60+(32*32)+(11*10*3))+(56*3); di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768)+(56*3); cx = 3*5; _movsb(cx, true); si = (0+(228*13)+32+60+(32*32)+(11*10*3))+(77*3); di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768)+(77*3); cx = 3*2; _movsb(cx, true); data.byte(kFadedirection) = 1; data.byte(kFadecount) = 31; data.byte(kColourpos) = 0; data.byte(kNumtofade) = 32; } void DreamGenContext::rollEm() { STACK_CHECK; cl = 160; ch = 160; di = 25; bx = 20; ds = data.word(kMapstore); si = 0; multiGet(); es = data.word(kTextfile1); si = 49*2; ax = es.word(si); si = ax; _add(si, (66*2)); cx = 80; endcredits21: push(cx); bx = 10; cx = data.word(kLinespacing); endcredits22: push(cx); push(si); push(di); push(es); push(bx); vSync(); cl = 160; ch = 160; di = 25; bx = 20; ds = data.word(kMapstore); si = 0; multiPut(); vSync(); bx = pop(); es = pop(); di = pop(); si = pop(); push(si); push(di); push(es); push(bx); cx = 18; onelot2: push(cx); di = 25; dx = 161; ax = 0; printDirect(); _add(bx, data.word(kLinespacing)); cx = pop(); if (--cx) goto onelot2; vSync(); cl = 160; ch = 160; di = 25; bx = 20; multiDump(); bx = pop(); es = pop(); di = pop(); si = pop(); cx = pop(); _cmp(data.byte(kLasthardkey), 1); if (flags.z()) goto endearly2; _dec(bx); if (--cx) goto endcredits22; cx = pop(); looknext2: al = es.byte(si); _inc(si); _cmp(al, ':'); if (flags.z()) goto gotnext2; _cmp(al, 0); if (flags.z()) goto gotnext2; goto looknext2; gotnext2: _cmp(data.byte(kLasthardkey), 1); if (flags.z()) return /* (endearly) */; if (--cx) goto endcredits21; cx = 120; hangOne(); return; endearly2: cx = pop(); } void DreamGenContext::fadeDownMon() { STACK_CHECK; palToStartPal(); palToEndPal(); es = data.word(kBuffers); di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768)+(231*3); cx = 3*8; ax = 0; _stosb(cx, true); di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768)+(246*3); _stosb(); _stosw(); data.byte(kFadedirection) = 1; data.byte(kFadecount) = 63; data.byte(kColourpos) = 0; data.byte(kNumtofade) = 128; cx = 64; hangOn(); } void DreamGenContext::fadeUpMon() { STACK_CHECK; palToStartPal(); palToEndPal(); es = data.word(kBuffers); di = (0+(228*13)+32+60+(32*32)+(11*10*3))+(231*3); cx = 3*8; ax = 0; _stosb(cx, true); di = (0+(228*13)+32+60+(32*32)+(11*10*3))+(246*3); _stosb(); _stosw(); data.byte(kFadedirection) = 1; data.byte(kFadecount) = 63; data.byte(kColourpos) = 0; data.byte(kNumtofade) = 128; cx = 128; hangOn(); } void DreamGenContext::initialMonCols() { STACK_CHECK; palToStartPal(); es = data.word(kBuffers); di = (0+(228*13)+32+60+(32*32)+(11*10*3))+(230*3); cx = 3*9; ax = 0; _stosb(cx, true); di = (0+(228*13)+32+60+(32*32)+(11*10*3))+(246*3); _stosb(); _stosw(); ds = data.word(kBuffers); si = (0+(228*13)+32+60+(32*32)+(11*10*3))+(230*3); al = 230; cx = 18; showGroup(); } void DreamGenContext::runEndSeq() { STACK_CHECK; atmospheres(); data.byte(kGetback) = 0; moreendseq: vSync(); spriteUpdate(); vSync(); delEverything(); printSprites(); reelsOnScreen(); afterIntroRoom(); useTimedText(); vSync(); dumpMap(); dumpTimedText(); vSync(); _cmp(data.byte(kGetback), 1); if (!flags.z()) goto moreendseq; } void DreamGenContext::fillOpen() { STACK_CHECK; delTextLine(); getOpenedSize(); _cmp(ah, 4); if (flags.c()) goto lessthanapage; ah = 4; lessthanapage: al = 1; push(ax); es = data.word(kBuffers); di = (0+(228*13)); findAllOpen(); si = (0+(228*13)); di = (80); bx = (58)+96; cx = pop(); openloop1: push(cx); push(di); push(bx); ax = es.word(si); _add(si, 2); push(si); push(es); _cmp(ch, cl); if (flags.c()) goto nextopenslot; obToInv(); nextopenslot: es = pop(); si = pop(); bx = pop(); di = pop(); cx = pop(); _add(di, (44)); _inc(cl); _cmp(cl, 5); if (!flags.z()) goto openloop1; underTextLine(); } void DreamGenContext::findAllOpen() { STACK_CHECK; push(di); cx = 16; ax = 0x0ffff; _stosw(cx, true); di = pop(); cl = data.byte(kOpenedob); dl = data.byte(kOpenedtype); ds = data.word(kExtras); bx = (0+2080+30000); ch = 0; findopen1: _cmp(ds.byte(bx+3), cl); if (!flags.z()) goto findopen2; _cmp(ds.byte(bx+2), dl); if (!flags.z()) goto findopen2; _cmp(data.byte(kOpenedtype), 4); if (flags.z()) goto noloccheck; al = ds.byte(bx+5); _cmp(al, data.byte(kReallocation)); if (!flags.z()) goto findopen2; noloccheck: al = ds.byte(bx+4); ah = 0; push(di); _add(di, ax); _add(di, ax); al = ch; ah = 4; _stosw(); di = pop(); findopen2: _add(bx, 16); _inc(ch); _cmp(ch, (114)); if (!flags.z()) goto findopen1; cl = data.byte(kOpenedob); dl = data.byte(kOpenedtype); push(dx); ds = data.word(kFreedat); dx = pop(); bx = 0; ch = 0; findopen1a: _cmp(ds.byte(bx+3), cl); if (!flags.z()) goto findopen2a; _cmp(ds.byte(bx+2), dl); if (!flags.z()) goto findopen2a; al = ds.byte(bx+4); ah = 0; push(di); _add(di, ax); _add(di, ax); al = ch; ah = 2; _stosw(); di = pop(); findopen2a: _add(bx, 16); _inc(ch); _cmp(ch, 80); if (!flags.z()) goto findopen1a; } void DreamGenContext::incRyanPage() { STACK_CHECK; _cmp(data.byte(kCommandtype), 222); if (flags.z()) goto alreadyincryan; data.byte(kCommandtype) = 222; al = 31; commandOnly(); alreadyincryan: ax = data.word(kMousebutton); _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (noincryan) */; _and(ax, 1); if (!flags.z()) goto doincryan; return; doincryan: ax = data.word(kMousex); _sub(ax, (80)+167); data.byte(kRyanpage) = -1; findnewpage: _inc(data.byte(kRyanpage)); _sub(ax, 18); if (!flags.c()) goto findnewpage; delPointer(); fillRyan(); readMouse(); showPointer(); workToScreen(); delPointer(); } void DreamGenContext::openOb() { STACK_CHECK; al = data.byte(kOpenedob); ah = data.byte(kOpenedtype); di = offset_commandline; copyName(); di = (80); bx = (58)+86; al = 62; dl = 240; printMessage(); di = data.word(kLastxpos); _add(di, 5); bx = (58)+86; es = cs; si = offset_commandline; dl = 220; al = 0; ah = 0; printDirect(); fillOpen(); getOpenedSize(); al = ah; ah = 0; cx = (44); _mul(cx); _add(ax, (80)); bx = offset_openchangesize; cs.word(bx) = ax; } void DreamGenContext::describeOb() { STACK_CHECK; getObTextStart(); di = 33; bx = 92; _cmp(data.byte(kForeignrelease), 0); if (flags.z()) goto notsetd; _cmp(data.byte(kObjecttype), 1); if (!flags.z()) goto notsetd; bx = 82; notsetd: dl = 241; ah = 16; data.word(kCharshift) = 91+91; printDirect(); data.word(kCharshift) = 0; di = 36; bx = 104; _cmp(data.byte(kForeignrelease), 0); if (flags.z()) goto notsetd2; _cmp(data.byte(kObjecttype), 1); if (!flags.z()) goto notsetd2; bx = 94; notsetd2: dl = 241; ah = 0; printDirect(); push(bx); obsThatDoThings(); bx = pop(); additionalText(); } void DreamGenContext::additionalText() { STACK_CHECK; _add(bx, 10); push(bx); al = data.byte(kCommand); ah = data.byte(kObjecttype); cl = 'C'; ch = 'U'; dl = 'P'; dh = 'E'; compare(); if (flags.z()) goto emptycup; al = data.byte(kCommand); ah = data.byte(kObjecttype); cl = 'C'; ch = 'U'; dl = 'P'; dh = 'F'; compare(); if (flags.z()) goto fullcup; bx = pop(); return; emptycup: al = 40; findPuzText(); bx = pop(); di = 36; dl = 241; ah = 0; printDirect(); return; fullcup: al = 39; findPuzText(); bx = pop(); di = 36; dl = 241; ah = 0; printDirect(); } void DreamGenContext::getObTextStart() { STACK_CHECK; es = data.word(kFreedesc); si = (0); cx = (0+(82*2)); _cmp(data.byte(kObjecttype), 2); if (flags.z()) goto describe; es = data.word(kSetdesc); si = (0); cx = (0+(130*2)); _cmp(data.byte(kObjecttype), 1); if (flags.z()) goto describe; es = data.word(kExtras); si = (0+2080+30000+(16*114)); cx = (0+2080+30000+(16*114)+((114+2)*2)); describe: al = data.byte(kCommand); ah = 0; _add(ax, ax); _add(si, ax); ax = es.word(si); _add(ax, cx); si = ax; bx = ax; tryagain: push(si); findNextColon(); al = es.byte(si); cx = si; si = pop(); _cmp(data.byte(kObjecttype), 1); if (!flags.z()) return /* (cantmakeoneup) */; _cmp(al, 0); if (flags.z()) goto findsometext; _cmp(al, ':'); if (flags.z()) goto findsometext; return; findsometext: searchForSame(); goto tryagain; } void DreamGenContext::searchForSame() { STACK_CHECK; si = cx; searchagain: _inc(si); al = es.byte(bx); search: _cmp(es.byte(si), al); if (flags.z()) goto gotstartletter; _inc(cx); _inc(si); _cmp(si, 8000); if (flags.c()) goto search; si = bx; ax = pop(); return; gotstartletter: push(bx); push(si); keepchecking: _inc(si); _inc(bx); al = es.byte(bx); ah = es.byte(si); _cmp(al, ':'); if (flags.z()) goto foundmatch; _cmp(al, 0); if (flags.z()) goto foundmatch; _cmp(al, ah); if (flags.z()) goto keepchecking; si = pop(); bx = pop(); goto searchagain; foundmatch: si = pop(); bx = pop(); } void DreamGenContext::setPickup() { STACK_CHECK; _cmp(data.byte(kObjecttype), 1); if (flags.z()) goto cantpick; _cmp(data.byte(kObjecttype), 3); if (flags.z()) goto cantpick; getAnyAd(); al = es.byte(bx+2); _cmp(al, 4); if (!flags.z()) goto canpick; cantpick: blank(); return; canpick: _cmp(data.byte(kCommandtype), 209); if (flags.z()) goto alreadysp; data.byte(kCommandtype) = 209; bl = data.byte(kCommand); bh = data.byte(kObjecttype); al = 33; commandWithOb(); alreadysp: ax = data.word(kMousebutton); _cmp(ax, 1); if (!flags.z()) return /* (nosetpick) */; _cmp(ax, data.word(kOldbutton)); if (!flags.z()) goto dosetpick; return; dosetpick: createPanel(); showPanel(); showMan(); showExit(); examIcon(); data.byte(kPickup) = 1; data.byte(kInvopen) = 2; _cmp(data.byte(kObjecttype), 4); if (flags.z()) goto pickupexob; al = data.byte(kCommand); data.byte(kItemframe) = al; data.byte(kOpenedob) = 255; transferToEx(); data.byte(kItemframe) = al; data.byte(kObjecttype) = 4; getEitherAd(); es.byte(bx+2) = 20; es.byte(bx+3) = 255; openInv(); workToScreenM(); return; pickupexob: al = data.byte(kCommand); data.byte(kItemframe) = al; data.byte(kOpenedob) = 255; openInv(); workToScreenM(); } void DreamGenContext::reExFromInv() { STACK_CHECK; findInvPos(); ax = es.word(bx); data.byte(kCommandtype) = ah; data.byte(kCommand) = al; data.byte(kExamagain) = 1; data.byte(kPointermode) = 0; } void DreamGenContext::swapWithInv() { STACK_CHECK; al = data.byte(kItemframe); ah = data.byte(kObjecttype); _cmp(ax, data.word(kOldsubject)); if (!flags.z()) goto difsub7; _cmp(data.byte(kCommandtype), 243); if (flags.z()) goto alreadyswap1; data.byte(kCommandtype) = 243; difsub7: data.word(kOldsubject) = ax; bx = ax; al = 34; commandWithOb(); alreadyswap1: ax = data.word(kMousebutton); _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (cantswap1) */; _and(ax, 1); if (!flags.z()) goto doswap1; return; doswap1: ah = data.byte(kObjecttype); al = data.byte(kItemframe); push(ax); findInvPos(); ax = es.word(bx); data.byte(kItemframe) = al; data.byte(kObjecttype) = ah; getEitherAd(); es.byte(bx+2) = 20; es.byte(bx+3) = 255; bl = data.byte(kItemframe); bh = data.byte(kObjecttype); ax = pop(); data.byte(kObjecttype) = ah; data.byte(kItemframe) = al; push(bx); findInvPos(); delPointer(); al = data.byte(kItemframe); getEitherAd(); es.byte(bx+2) = 4; es.byte(bx+3) = 255; al = data.byte(kLastinvpos); es.byte(bx+4) = al; ax = pop(); data.byte(kObjecttype) = ah; data.byte(kItemframe) = al; fillRyan(); readMouse(); showPointer(); workToScreen(); delPointer(); } void DreamGenContext::swapWithOpen() { STACK_CHECK; al = data.byte(kItemframe); ah = data.byte(kObjecttype); _cmp(ax, data.word(kOldsubject)); if (!flags.z()) goto difsub8; _cmp(data.byte(kCommandtype), 242); if (flags.z()) goto alreadyswap2; data.byte(kCommandtype) = 242; difsub8: data.word(kOldsubject) = ax; bx = ax; al = 34; commandWithOb(); alreadyswap2: ax = data.word(kMousebutton); _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (cantswap2) */; _and(ax, 1); if (!flags.z()) goto doswap2; return; doswap2: getEitherAd(); isItWorn(); if (!flags.z()) goto notwornswap; wornError(); return; notwornswap: delPointer(); al = data.byte(kItemframe); _cmp(al, data.byte(kOpenedob)); if (!flags.z()) goto isntsame2; al = data.byte(kObjecttype); _cmp(al, data.byte(kOpenedtype)); if (!flags.z()) goto isntsame2; errorMessage1(); return; isntsame2: checkObjectSize(); _cmp(al, 0); if (flags.z()) goto sizeok2; return; sizeok2: ah = data.byte(kObjecttype); al = data.byte(kItemframe); push(ax); findOpenPos(); ax = es.word(bx); data.byte(kItemframe) = al; data.byte(kObjecttype) = ah; _cmp(ah, 4); if (!flags.z()) goto makeswapex; getEitherAd(); es.byte(bx+2) = 20; es.byte(bx+3) = 255; goto actuallyswap; makeswapex: transferToEx(); data.byte(kItemframe) = al; data.byte(kObjecttype) = 4; getEitherAd(); es.byte(bx+2) = 20; es.byte(bx+3) = 255; actuallyswap: bl = data.byte(kItemframe); bh = data.byte(kObjecttype); ax = pop(); data.byte(kObjecttype) = ah; data.byte(kItemframe) = al; push(bx); findOpenPos(); getEitherAd(); al = data.byte(kOpenedtype); es.byte(bx+2) = al; al = data.byte(kOpenedob); es.byte(bx+3) = al; al = data.byte(kLastinvpos); es.byte(bx+4) = al; al = data.byte(kReallocation); es.byte(bx+5) = al; ax = pop(); data.byte(kObjecttype) = ah; data.byte(kItemframe) = al; fillOpen(); fillRyan(); underTextLine(); readMouse(); useOpened(); showPointer(); workToScreen(); delPointer(); } void DreamGenContext::inToInv() { STACK_CHECK; _cmp(data.byte(kPickup), 0); if (!flags.z()) goto notout; outOfInv(); return; notout: findInvPos(); ax = es.word(bx); _cmp(al, 255); if (flags.z()) goto canplace1; swapWithInv(); return; canplace1: al = data.byte(kItemframe); ah = data.byte(kObjecttype); _cmp(ax, data.word(kOldsubject)); if (!flags.z()) goto difsub1; _cmp(data.byte(kCommandtype), 220); if (flags.z()) goto alreadyplce; data.byte(kCommandtype) = 220; difsub1: data.word(kOldsubject) = ax; bx = ax; al = 35; commandWithOb(); alreadyplce: ax = data.word(kMousebutton); _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (notletgo2) */; _and(ax, 1); if (!flags.z()) goto doplace; return; doplace: delPointer(); al = data.byte(kItemframe); getExAd(); es.byte(bx+2) = 4; es.byte(bx+3) = 255; al = data.byte(kLastinvpos); es.byte(bx+4) = al; data.byte(kPickup) = 0; fillRyan(); readMouse(); showPointer(); outOfInv(); workToScreen(); delPointer(); } void DreamGenContext::outOfInv() { STACK_CHECK; findInvPos(); ax = es.word(bx); _cmp(al, 255); if (!flags.z()) goto canpick2; blank(); return; canpick2: bx = data.word(kMousebutton); _cmp(bx, 2); if (!flags.z()) goto canpick2a; reExFromInv(); return; canpick2a: _cmp(ax, data.word(kOldsubject)); if (!flags.z()) goto difsub3; _cmp(data.byte(kCommandtype), 221); if (flags.z()) goto alreadygrab; data.byte(kCommandtype) = 221; difsub3: data.word(kOldsubject) = ax; bx = ax; al = 36; commandWithOb(); alreadygrab: ax = data.word(kMousebutton); _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (notletgo) */; _and(ax, 1); if (!flags.z()) goto dograb; return; dograb: delPointer(); data.byte(kPickup) = 1; findInvPos(); ax = es.word(bx); data.byte(kItemframe) = al; data.byte(kObjecttype) = ah; getExAd(); es.byte(bx+2) = 20; es.byte(bx+3) = 255; fillRyan(); readMouse(); showPointer(); inToInv(); workToScreen(); delPointer(); } void DreamGenContext::getFreeAd() { STACK_CHECK; ah = 0; cl = 4; _shl(ax, cl); bx = ax; es = data.word(kFreedat); } void DreamGenContext::getExAd() { STACK_CHECK; ah = 0; bx = 16; _mul(bx); bx = ax; es = data.word(kExtras); _add(bx, (0+2080+30000)); } void DreamGenContext::getEitherAd() { STACK_CHECK; _cmp(data.byte(kObjecttype), 4); if (flags.z()) goto isinexlist; al = data.byte(kItemframe); getFreeAd(); return; isinexlist: al = data.byte(kItemframe); getExAd(); } void DreamGenContext::getAnyAd() { STACK_CHECK; _cmp(data.byte(kObjecttype), 4); if (flags.z()) goto isex; _cmp(data.byte(kObjecttype), 2); if (flags.z()) goto isfree; al = data.byte(kCommand); getSetAd(); ax = es.word(bx+4); return; isfree: al = data.byte(kCommand); getFreeAd(); ax = es.word(bx+7); return; isex: al = data.byte(kCommand); getExAd(); ax = es.word(bx+7); } void DreamGenContext::getOpenedSize() { STACK_CHECK; _cmp(data.byte(kOpenedtype), 4); if (flags.z()) goto isex2; _cmp(data.byte(kOpenedtype), 2); if (flags.z()) goto isfree2; al = data.byte(kOpenedob); getSetAd(); ax = es.word(bx+3); return; isfree2: al = data.byte(kOpenedob); getFreeAd(); ax = es.word(bx+7); return; isex2: al = data.byte(kOpenedob); getExAd(); ax = es.word(bx+7); } void DreamGenContext::getSetAd() { STACK_CHECK; ah = 0; bx = 64; _mul(bx); bx = ax; es = data.word(kSetdat); } void DreamGenContext::findInvPos() { STACK_CHECK; cx = data.word(kMousex); _sub(cx, (80)); bx = -1; findinv1: _inc(bx); _sub(cx, (44)); if (!flags.c()) goto findinv1; cx = data.word(kMousey); _sub(cx, (58)); _sub(bx, 5); findinv2: _add(bx, 5); _sub(cx, (44)); if (!flags.c()) goto findinv2; al = data.byte(kRyanpage); ah = 0; cx = 10; _mul(cx); _add(bx, ax); al = bl; data.byte(kLastinvpos) = al; _add(bx, bx); es = data.word(kBuffers); _add(bx, (0+(228*13)+32)); } void DreamGenContext::findOpenPos() { STACK_CHECK; cx = data.word(kMousex); _sub(cx, (80)); bx = -1; findopenp1: _inc(bx); _sub(cx, (44)); if (!flags.c()) goto findopenp1; al = bl; data.byte(kLastinvpos) = al; _add(bx, bx); es = data.word(kBuffers); _add(bx, (0+(228*13))); } void DreamGenContext::dropObject() { STACK_CHECK; _cmp(data.byte(kCommandtype), 223); if (flags.z()) goto alreadydrop; data.byte(kCommandtype) = 223; _cmp(data.byte(kPickup), 0); if (flags.z()) { blank(); return; }; bl = data.byte(kItemframe); bh = data.byte(kObjecttype); al = 37; commandWithOb(); alreadydrop: ax = data.word(kMousebutton); _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (nodrop) */; _and(ax, 1); if (!flags.z()) goto dodrop; return; dodrop: getEitherAd(); isItWorn(); if (!flags.z()) goto nowornerror; wornError(); return; nowornerror: _cmp(data.byte(kReallocation), 47); if (flags.z()) goto nodrop2; cl = data.byte(kRyanx); _add(cl, 12); ch = data.byte(kRyany); _add(ch, 12); checkOne(); _cmp(cl, 2); if (flags.c()) goto nodroperror; nodrop2: dropError(); return; nodroperror: _cmp(data.byte(kMapxsize), 64); if (!flags.z()) goto notinlift; _cmp(data.byte(kMapysize), 64); if (!flags.z()) goto notinlift; dropError(); return; notinlift: al = data.byte(kItemframe); ah = 4; cl = 'G'; ch = 'U'; dl = 'N'; dh = 'A'; compare(); if (flags.z()) { cantDrop(); return; }; al = data.byte(kItemframe); ah = 4; cl = 'S'; ch = 'H'; dl = 'L'; dh = 'D'; compare(); if (flags.z()) { cantDrop(); return; }; data.byte(kObjecttype) = 4; al = data.byte(kItemframe); getExAd(); es.byte(bx+2) = 0; al = data.byte(kRyanx); _add(al, 4); cl = 4; _shr(al, cl); _add(al, data.byte(kMapx)); ah = data.byte(kRyany); _add(ah, 8); cl = 4; _shr(ah, cl); _add(ah, data.byte(kMapy)); es.byte(bx+3) = al; es.byte(bx+5) = ah; al = data.byte(kRyanx); _add(al, 4); _and(al, 15); ah = data.byte(kRyany); _add(ah, 8); _and(ah, 15); es.byte(bx+4) = al; es.byte(bx+6) = ah; data.byte(kPickup) = 0; al = data.byte(kReallocation); es.byte(bx) = al; } void DreamGenContext::removeObFromInv() { STACK_CHECK; _cmp(data.byte(kCommand), 100); if (flags.z()) return /* (obnotexist) */; getAnyAd(); di = bx; cl = data.byte(kCommand); ch = 0; deleteExObject(); } void DreamGenContext::selectOpenOb() { STACK_CHECK; al = data.byte(kCommand); getAnyAd(); _cmp(al, 255); if (!flags.z()) goto canopenit1; blank(); return; canopenit1: _cmp(data.byte(kCommandtype), 224); if (flags.z()) goto alreadyopob; data.byte(kCommandtype) = 224; bl = data.byte(kCommand); bh = data.byte(kObjecttype); al = 38; commandWithOb(); alreadyopob: ax = data.word(kMousebutton); _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (noopenob) */; _and(ax, 1); if (!flags.z()) goto doopenob; return; doopenob: al = data.byte(kCommand); data.byte(kOpenedob) = al; al = data.byte(kObjecttype); data.byte(kOpenedtype) = al; createPanel(); showPanel(); showMan(); examIcon(); showExit(); openInv(); openOb(); underTextLine(); readMouse(); showPointer(); workToScreen(); delPointer(); } void DreamGenContext::useOpened() { STACK_CHECK; _cmp(data.byte(kOpenedob), 255); if (flags.z()) return /* (cannotuseopen) */; _cmp(data.byte(kPickup), 0); if (!flags.z()) goto notout2; outOfOpen(); return; notout2: findOpenPos(); ax = es.word(bx); _cmp(al, 255); if (flags.z()) goto canplace3; swapWithOpen(); return; canplace3: _cmp(data.byte(kPickup), 1); if (flags.z()) goto intoopen; blank(); return; intoopen: al = data.byte(kItemframe); ah = data.byte(kObjecttype); _cmp(ax, data.word(kOldsubject)); if (!flags.z()) goto difsub2; _cmp(data.byte(kCommandtype), 227); if (flags.z()) goto alreadyplc2; data.byte(kCommandtype) = 227; difsub2: data.word(kOldsubject) = ax; bx = ax; al = 35; commandWithOb(); alreadyplc2: ax = data.word(kMousebutton); _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (notletgo3) */; _cmp(ax, 1); if (flags.z()) goto doplace2; return; doplace2: getEitherAd(); isItWorn(); if (!flags.z()) goto notworntoopen; wornError(); return; notworntoopen: delPointer(); al = data.byte(kItemframe); _cmp(al, data.byte(kOpenedob)); if (!flags.z()) goto isntsame; al = data.byte(kObjecttype); _cmp(al, data.byte(kOpenedtype)); if (!flags.z()) goto isntsame; errorMessage1(); return; isntsame: checkObjectSize(); _cmp(al, 0); if (flags.z()) goto sizeok1; return; sizeok1: data.byte(kPickup) = 0; al = data.byte(kItemframe); getEitherAd(); al = data.byte(kOpenedtype); es.byte(bx+2) = al; al = data.byte(kOpenedob); es.byte(bx+3) = al; al = data.byte(kLastinvpos); es.byte(bx+4) = al; al = data.byte(kReallocation); es.byte(bx+5) = al; fillOpen(); underTextLine(); readMouse(); useOpened(); showPointer(); workToScreen(); delPointer(); } void DreamGenContext::checkObjectSize() { STACK_CHECK; getOpenedSize(); push(ax); al = data.byte(kItemframe); getEitherAd(); al = es.byte(bx+9); cx = pop(); _cmp(al, 255); if (!flags.z()) goto notunsized; al = 6; notunsized: _cmp(al, 100); if (!flags.c()) goto specialcase; _cmp(cl, 100); if (flags.c()) goto isntspecial; errorMessage3(); goto sizewrong; isntspecial: _cmp(cl, al); if (!flags.c()) goto sizeok; specialcase: _sub(al, 100); _cmp(cl, 100); if (!flags.c()) goto bothspecial; _cmp(cl, al); if (!flags.c()) goto sizeok; errorMessage2(); goto sizewrong; bothspecial: _sub(cl, 100); _cmp(al, cl); if (flags.z()) goto sizeok; errorMessage3(); sizewrong: al = 1; return; sizeok: al = 0; } void DreamGenContext::outOfOpen() { STACK_CHECK; _cmp(data.byte(kOpenedob), 255); if (flags.z()) goto cantuseopen; findOpenPos(); ax = es.word(bx); _cmp(al, 255); if (!flags.z()) goto canpick4; cantuseopen: blank(); return; canpick4: _cmp(ax, data.word(kOldsubject)); if (!flags.z()) goto difsub4; _cmp(data.byte(kCommandtype), 228); if (flags.z()) goto alreadygrb; data.byte(kCommandtype) = 228; difsub4: data.word(kOldsubject) = ax; bx = ax; al = 36; commandWithOb(); alreadygrb: ax = data.word(kMousebutton); _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (notletgo4) */; _cmp(ax, 1); if (flags.z()) goto dogrb; _cmp(ax, 2); if (!flags.z()) return /* (notletgo4) */; reExFromOpen(); return; dogrb: delPointer(); data.byte(kPickup) = 1; findOpenPos(); ax = es.word(bx); data.byte(kItemframe) = al; data.byte(kObjecttype) = ah; _cmp(ah, 4); if (!flags.z()) goto makeintoex; getEitherAd(); es.byte(bx+2) = 20; es.byte(bx+3) = 255; goto actuallyout; makeintoex: transferToEx(); data.byte(kItemframe) = al; data.byte(kObjecttype) = 4; getEitherAd(); es.byte(bx+2) = 20; es.byte(bx+3) = 255; actuallyout: fillOpen(); underTextLine(); readMouse(); useOpened(); showPointer(); workToScreen(); delPointer(); } void DreamGenContext::transferToEx() { STACK_CHECK; emergencyPurge(); getExPos(); al = data.byte(kExpos); push(ax); push(di); al = data.byte(kItemframe); ah = 0; bx = 16; _mul(bx); ds = data.word(kFreedat); si = ax; cx = 8; _movsw(cx, true); di = pop(); al = data.byte(kReallocation); es.byte(di) = al; es.byte(di+11) = al; al = data.byte(kItemframe); es.byte(di+1) = al; es.byte(di+2) = 4; es.byte(di+3) = 255; al = data.byte(kLastinvpos); es.byte(di+4) = al; al = data.byte(kItemframe); data.byte(kItemtotran) = al; transferMap(); transferInv(); transferText(); al = data.byte(kItemframe); ah = 0; bx = 16; _mul(bx); ds = data.word(kFreedat); si = ax; ds.byte(si+2) = 254; pickupConts(); ax = pop(); } void DreamGenContext::pickupConts() { STACK_CHECK; al = ds.byte(si+7); _cmp(al, 255); if (flags.z()) return /* (notopenable) */; al = data.byte(kItemframe); ah = data.byte(kObjecttype); dl = data.byte(kExpos); es = data.word(kFreedat); bx = 0; cx = 0; pickupcontloop: push(cx); push(es); push(bx); push(dx); push(ax); _cmp(es.byte(bx+2), ah); if (!flags.z()) goto notinsidethis; _cmp(es.byte(bx+3), al); if (!flags.z()) goto notinsidethis; data.byte(kItemtotran) = cl; transferConToEx(); notinsidethis: ax = pop(); dx = pop(); bx = pop(); es = pop(); cx = pop(); _add(bx, 16); _inc(cx); _cmp(cx, 80); if (!flags.z()) goto pickupcontloop; } void DreamGenContext::transferConToEx() { STACK_CHECK; push(es); push(bx); push(dx); push(es); push(bx); getExPos(); si = pop(); ds = pop(); push(di); cx = 8; _movsw(cx, true); di = pop(); dx = pop(); al = data.byte(kReallocation); es.byte(di) = al; es.byte(di+11) = al; al = data.byte(kItemtotran); es.byte(di+1) = al; es.byte(di+3) = dl; es.byte(di+2) = 4; transferMap(); transferInv(); transferText(); si = pop(); ds = pop(); ds.byte(si+2) = 255; } void DreamGenContext::purgeALocation() { STACK_CHECK; push(ax); es = data.word(kExtras); di = (0+2080+30000); bx = pop(); cx = 0; purgeloc: _cmp(bl, es.byte(di+0)); if (!flags.z()) goto dontpurge; _cmp(es.byte(di+2), 0); if (!flags.z()) goto dontpurge; push(di); push(es); push(bx); push(cx); deleteExObject(); cx = pop(); bx = pop(); es = pop(); di = pop(); dontpurge: _add(di, 16); _inc(cx); _cmp(cx, (114)); if (!flags.z()) goto purgeloc; } void DreamGenContext::emergencyPurge() { STACK_CHECK; checkpurgeagain: ax = data.word(kExframepos); _add(ax, 4000); _cmp(ax, (30000)); if (flags.c()) goto notnearframeend; purgeAnItem(); goto checkpurgeagain; notnearframeend: ax = data.word(kExtextpos); _add(ax, 400); _cmp(ax, (18000)); if (flags.c()) return /* (notneartextend) */; purgeAnItem(); goto checkpurgeagain; } void DreamGenContext::purgeAnItem() { STACK_CHECK; es = data.word(kExtras); di = (0+2080+30000); bl = data.byte(kReallocation); cx = 0; lookforpurge: al = es.byte(di+2); _cmp(al, 0); if (!flags.z()) goto cantpurge; _cmp(es.byte(di+12), 2); if (flags.z()) goto iscup; _cmp(es.byte(di+12), 255); if (!flags.z()) goto cantpurge; iscup: _cmp(es.byte(di+11), bl); if (flags.z()) goto cantpurge; deleteExObject(); return; cantpurge: _add(di, 16); _inc(cx); _cmp(cx, (114)); if (!flags.z()) goto lookforpurge; di = (0+2080+30000); bl = data.byte(kReallocation); cx = 0; lookforpurge2: al = es.byte(di+2); _cmp(al, 0); if (!flags.z()) goto cantpurge2; _cmp(es.byte(di+12), 255); if (!flags.z()) goto cantpurge2; deleteExObject(); return; cantpurge2: _add(di, 16); _inc(cx); _cmp(cx, (114)); if (!flags.z()) goto lookforpurge2; } void DreamGenContext::deleteExObject() { STACK_CHECK; push(cx); push(cx); push(cx); push(cx); al = 255; cx = 16; _stosb(cx, true); ax = pop(); cl = al; _add(al, al); _add(al, cl); deleteExFrame(); ax = pop(); cl = al; _add(al, al); _add(al, cl); _inc(al); deleteExFrame(); ax = pop(); deleteExText(); bx = pop(); bh = bl; bl = 4; di = (0+2080+30000); cx = 0; deleteconts: _cmp(es.word(di+2), bx); if (!flags.z()) goto notinsideex; push(bx); push(cx); push(di); deleteExObject(); di = pop(); cx = pop(); bx = pop(); notinsideex: _add(di, 16); _inc(cx); _cmp(cx, (114)); if (!flags.z()) goto deleteconts; } void DreamGenContext::deleteExFrame() { STACK_CHECK; di = (0); ah = 0; _add(ax, ax); _add(di, ax); _add(ax, ax); _add(di, ax); al = es.byte(di); ah = 0; cl = es.byte(di+1); ch = 0; _mul(cx); si = es.word(di+2); push(si); _add(si, (0+2080)); cx = (30000); _sub(cx, es.word(di+2)); di = si; _add(si, ax); push(ax); ds = es; _movsb(cx, true); bx = pop(); _sub(data.word(kExframepos), bx); si = pop(); cx = (114)*3; di = (0); shuffleadsdown: ax = es.word(di+2); _cmp(ax, si); if (flags.c()) goto beforethisone; _sub(ax, bx); beforethisone: es.word(di+2) = ax; _add(di, 6); if (--cx) goto shuffleadsdown; } void DreamGenContext::deleteExText() { STACK_CHECK; di = (0+2080+30000+(16*114)); ah = 0; _add(ax, ax); _add(di, ax); ax = es.word(di); si = ax; di = ax; _add(si, (0+2080+30000+(16*114)+((114+2)*2))); _add(di, (0+2080+30000+(16*114)+((114+2)*2))); ax = 0; findlenextext: cl = es.byte(si); _inc(ax); _inc(si); _cmp(cl, 0); if (!flags.z()) goto findlenextext; cx = (18000); bx = si; _sub(bx, (0+2080+30000+(16*114)+((114+2)*2))); push(bx); push(ax); _sub(cx, bx); _movsb(cx, true); bx = pop(); _sub(data.word(kExtextpos), bx); si = pop(); cx = (114); di = (0+2080+30000+(16*114)); shuffletextads: ax = es.word(di); _cmp(ax, si); if (flags.c()) goto beforethistext; _sub(ax, bx); beforethistext: es.word(di) = ax; _add(di, 2); if (--cx) goto shuffletextads; } void DreamGenContext::startTalk() { STACK_CHECK; data.byte(kTalkmode) = 0; al = data.byte(kCharacter); _and(al, 127); getPersonText(); data.word(kCharshift) = 91+91; di = 66; bx = 64; dl = 241; al = 0; ah = 79; printDirect(); data.word(kCharshift) = 0; di = 66; bx = 80; dl = 241; al = 0; ah = 0; printDirect(); data.byte(kSpeechloaded) = 0; al = data.byte(kCharacter); _and(al, 127); ah = 0; cx = 64; _mul(cx); cl = 'C'; dl = 'R'; dh = data.byte(kReallocation); loadSpeech(); _cmp(data.byte(kSpeechloaded), 1); if (!flags.z()) return /* (nospeech1) */; data.byte(kVolumedirection) = 1; data.byte(kVolumeto) = 6; al = 50+12; playChannel1(); } void DreamGenContext::getPersonText() { STACK_CHECK; ah = 0; cx = 64*2; _mul(cx); si = ax; es = data.word(kPeople); _add(si, (0+24)); cx = (0+24+(1026*2)); ax = es.word(si); _add(ax, cx); si = ax; } void DreamGenContext::doSomeTalk() { STACK_CHECK; dospeech: al = data.byte(kTalkpos); al = data.byte(kCharacter); _and(al, 127); ah = 0; cx = 64; _mul(cx); cx = ax; al = data.byte(kTalkpos); ah = 0; _add(ax, cx); _add(ax, ax); si = ax; es = data.word(kPeople); _add(si, (0+24)); cx = (0+24+(1026*2)); ax = es.word(si); _add(ax, cx); si = ax; _cmp(es.byte(si), 0); if (flags.z()) goto endheartalk; push(es); push(si); createPanel(); showPanel(); showMan(); showExit(); convIcons(); si = pop(); es = pop(); di = 164; bx = 64; dl = 144; al = 0; ah = 0; printDirect(); al = data.byte(kCharacter); _and(al, 127); ah = 0; cx = 64; _mul(cx); cl = data.byte(kTalkpos); ch = 0; _add(ax, cx); cl = 'C'; dl = 'R'; dh = data.byte(kReallocation); loadSpeech(); _cmp(data.byte(kSpeechloaded), 0); if (flags.z()) goto noplay1; al = 62; playChannel1(); noplay1: data.byte(kPointermode) = 3; workToScreenM(); cx = 180; hangOnPQ(); if (!flags.c()) goto _tmp1; return; _tmp1: _inc(data.byte(kTalkpos)); al = data.byte(kTalkpos); al = data.byte(kCharacter); _and(al, 127); ah = 0; cx = 64; _mul(cx); cx = ax; al = data.byte(kTalkpos); ah = 0; _add(ax, cx); _add(ax, ax); si = ax; es = data.word(kPeople); _add(si, (0+24)); cx = (0+24+(1026*2)); ax = es.word(si); _add(ax, cx); si = ax; _cmp(es.byte(si), 0); if (flags.z()) goto endheartalk; _cmp(es.byte(si), ':'); if (flags.z()) goto skiptalk2; _cmp(es.byte(si), 32); if (flags.z()) goto skiptalk2; push(es); push(si); createPanel(); showPanel(); showMan(); showExit(); convIcons(); si = pop(); es = pop(); di = 48; bx = 128; dl = 144; al = 0; ah = 0; printDirect(); al = data.byte(kCharacter); _and(al, 127); ah = 0; cx = 64; _mul(cx); cl = data.byte(kTalkpos); ch = 0; _add(ax, cx); cl = 'C'; dl = 'R'; dh = data.byte(kReallocation); loadSpeech(); _cmp(data.byte(kSpeechloaded), 0); if (flags.z()) goto noplay2; al = 62; playChannel1(); noplay2: data.byte(kPointermode) = 3; workToScreenM(); cx = 180; hangOnPQ(); if (!flags.c()) goto skiptalk2; return; skiptalk2: _inc(data.byte(kTalkpos)); goto dospeech; endheartalk: data.byte(kPointermode) = 0; } void DreamGenContext::lookAtPlace() { STACK_CHECK; _cmp(data.byte(kCommandtype), 224); if (flags.z()) goto alreadyinfo; data.byte(kCommandtype) = 224; al = 27; commandOnly(); alreadyinfo: ax = data.word(kMousebutton); _and(ax, 1); if (flags.z()) return /* (noinfo) */; _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (noinfo) */; bl = data.byte(kDestpos); _cmp(bl, 15); if (!flags.c()) return /* (noinfo) */; push(bx); delPointer(); delTextLine(); getUnderCentre(); ds = data.word(kTempgraphics3); al = 0; ah = 0; di = 60; bx = 72; showFrame(); al = 4; ah = 0; di = 60; bx = 72+55; showFrame(); _cmp(data.byte(kForeignrelease), 0); if (flags.z()) goto _tmp1; al = 4; ah = 0; di = 60; bx = 72+55+21; showFrame(); _tmp1: bx = pop(); bh = 0; _add(bx, bx); es = data.word(kTraveltext); si = es.word(bx); _add(si, (66*2)); findNextColon(); di = 63; bx = 84; _cmp(data.byte(kForeignrelease), 0); if (flags.z()) goto _tmp2; bx = 84+4; _tmp2: dl = 191; al = 0; ah = 0; printDirect(); workToScreenM(); cx = 500; hangOnP(); data.byte(kPointermode) = 0; data.byte(kPointerframe) = 0; putUnderCentre(); workToScreenM(); } void DreamGenContext::locationPic() { STACK_CHECK; getDestInfo(); al = es.byte(si); push(es); push(si); di = 0; _cmp(al, 6); if (!flags.c()) goto secondlot; ds = data.word(kTempgraphics); _add(al, 4); goto gotgraphic; secondlot: _sub(al, 6); ds = data.word(kTempgraphics2); gotgraphic: _add(di, 104); bx = 138+14; ah = 0; showFrame(); si = pop(); es = pop(); al = data.byte(kDestpos); _cmp(al, data.byte(kReallocation)); if (!flags.z()) goto notinthisone; al = 3; di = 104; bx = 140+14; ds = data.word(kTempgraphics); ah = 0; showFrame(); notinthisone: bl = data.byte(kDestpos); bh = 0; _add(bx, bx); es = data.word(kTraveltext); si = es.word(bx); _add(si, (66*2)); di = 50; bx = 20; dl = 241; al = 0; ah = 0; printDirect(); } void DreamGenContext::getDestInfo() { STACK_CHECK; al = data.byte(kDestpos); ah = 0; push(ax); dx = data; es = dx; si = 1244; _add(si, ax); cl = es.byte(si); ax = pop(); push(cx); dx = data; es = dx; si = 1260; _add(si, ax); ax = pop(); } void DreamGenContext::resetLocation() { STACK_CHECK; push(ax); _cmp(al, 5); if (!flags.z()) goto notdelhotel; purgeALocation(); al = 21; purgeALocation(); al = 22; purgeALocation(); al = 27; purgeALocation(); goto clearedlocations; notdelhotel: _cmp(al, 8); if (!flags.z()) goto notdeltvstud; purgeALocation(); al = 28; purgeALocation(); goto clearedlocations; notdeltvstud: _cmp(al, 6); if (!flags.z()) goto notdelsarters; purgeALocation(); al = 20; purgeALocation(); al = 25; purgeALocation(); goto clearedlocations; notdelsarters: _cmp(al, 13); if (!flags.z()) goto notdelboathouse; purgeALocation(); al = 29; purgeALocation(); goto clearedlocations; notdelboathouse: clearedlocations: ax = pop(); ah = 0; bx = ax; dx = data; es = dx; _add(bx, 1244); es.byte(bx) = 0; } void DreamGenContext::lookInInterface() { STACK_CHECK; al = 'I'; ah = 'N'; cl = 'T'; ch = 'F'; findSetObject(); ah = 1; checkInside(); _cmp(cl, (114)); if (flags.z()) goto emptyinterface; al = es.byte(bx+15); _inc(al); return; emptyinterface: al = 0; } void DreamGenContext::makeCaps() { STACK_CHECK; _cmp(al, 'a'); if (flags.c()) return /* (notupperc) */; _sub(al, 32); } void DreamGenContext::execCommand() { STACK_CHECK; es = cs; bx = offset_comlist; ds = cs; si = 1278; al = ds.byte(si); _cmp(al, 0); if (!flags.z()) goto notblankinp; scrollMonitor(); return; notblankinp: cl = 0; comloop: push(bx); push(si); comloop2: al = ds.byte(si); _add(si, 2); ah = es.byte(bx); _inc(bx); _cmp(ah, 32); if (flags.z()) goto foundcom; _cmp(al, ah); if (flags.z()) goto comloop2; si = pop(); bx = pop(); _add(bx, 10); _inc(cl); _cmp(cl, 6); if (!flags.z()) goto comloop; netError(); al = 0; return; foundcom: si = pop(); bx = pop(); _cmp(cl, 1); if (flags.z()) goto testcom; _cmp(cl, 2); if (flags.z()) goto directory; _cmp(cl, 3); if (flags.z()) goto accesscom; _cmp(cl, 4); if (flags.z()) goto signoncom; _cmp(cl, 5); if (flags.z()) goto keyscom; goto quitcom; directory: dirCom(); al = 0; return; signoncom: signOn(); al = 0; return; accesscom: read(); al = 0; return; keyscom: showKeys(); al = 0; return; testcom: al = 6; monMessage(); al = 0; return; quitcom: al = 1; } void DreamGenContext::dirCom() { STACK_CHECK; cx = 30; randomAccess(); parser(); _cmp(es.byte(di+1), 0); if (flags.z()) goto dirroot; dirFile(); return; dirroot: data.byte(kLogonum) = 0; ds = cs; si = offset_rootdir; _inc(si); es = cs; di = 1120; _inc(di); cx = 12; _movsb(cx, true); monitorLogo(); scrollMonitor(); al = 9; monMessage(); es = data.word(kTextfile1); searchForFiles(); es = data.word(kTextfile2); searchForFiles(); es = data.word(kTextfile3); searchForFiles(); scrollMonitor(); } void DreamGenContext::searchForFiles() { STACK_CHECK; bx = (66*2); directloop1: al = es.byte(bx); _inc(bx); _cmp(al, '*'); if (flags.z()) return /* (endofdir) */; _cmp(al, 34); if (!flags.z()) goto directloop1; monPrint(); goto directloop1; } void DreamGenContext::signOn() { STACK_CHECK; parser(); _inc(di); ds = cs; si = offset_keys; cx = 4; signonloop: push(cx); push(si); push(di); _add(si, 14); cx = 11; signonloop2: _lodsb(); _cmp(al, 32); if (flags.z()) goto foundsign; makeCaps(); ah = es.byte(di); _inc(di); _cmp(al, ah); if (!flags.z()) goto nomatch; if (--cx) goto signonloop2; nomatch: di = pop(); si = pop(); cx = pop(); _add(si, 26); if (--cx) goto signonloop; al = 13; monMessage(); return; foundsign: di = pop(); si = pop(); cx = pop(); bx = si; es = ds; _cmp(es.byte(bx), 0); if (flags.z()) goto notyetassigned; al = 17; monMessage(); return; notyetassigned: push(es); push(bx); scrollMonitor(); al = 15; monMessage(); di = data.word(kMonadx); bx = data.word(kMonady); push(di); push(bx); input(); bx = pop(); di = pop(); data.word(kMonadx) = di; data.word(kMonady) = bx; bx = pop(); es = pop(); push(es); push(bx); _add(bx, 2); ds = cs; si = 1278; checkpass: _lodsw(); ah = es.byte(bx); _inc(bx); _cmp(ah, 32); if (flags.z()) goto passpassed; _cmp(al, ah); if (flags.z()) goto checkpass; bx = pop(); es = pop(); scrollMonitor(); al = 16; monMessage(); return; passpassed: al = 14; monMessage(); bx = pop(); es = pop(); push(es); push(bx); _add(bx, 14); monPrint(); scrollMonitor(); bx = pop(); es = pop(); es.byte(bx) = 1; } void DreamGenContext::showKeys() { STACK_CHECK; cx = 10; randomAccess(); scrollMonitor(); al = 18; monMessage(); es = cs; bx = offset_keys; cx = 4; keysloop: push(cx); push(bx); _cmp(es.byte(bx), 0); if (flags.z()) goto notheld; _add(bx, 14); monPrint(); notheld: bx = pop(); cx = pop(); _add(bx, 26); if (--cx) goto keysloop; scrollMonitor(); } void DreamGenContext::read() { STACK_CHECK; cx = 40; randomAccess(); parser(); _cmp(es.byte(di+1), 0); if (!flags.z()) goto okcom; netError(); return; okcom: es = cs; di = 1120; ax = data.word(kTextfile1); data.word(kMonsource) = ax; ds = ax; si = (66*2); searchForString(); _cmp(al, 0); if (flags.z()) goto foundfile2; ax = data.word(kTextfile2); data.word(kMonsource) = ax; ds = ax; si = (66*2); searchForString(); _cmp(al, 0); if (flags.z()) goto foundfile2; ax = data.word(kTextfile3); data.word(kMonsource) = ax; ds = ax; si = (66*2); searchForString(); _cmp(al, 0); if (flags.z()) goto foundfile2; al = 7; monMessage(); return; foundfile2: getKeyAndLogo(); _cmp(al, 0); if (flags.z()) goto keyok1; return; keyok1: es = cs; di = offset_operand1; ds = data.word(kMonsource); searchForString(); _cmp(al, 0); if (flags.z()) goto findtopictext; al = data.byte(kOldlogonum); data.byte(kLogonum) = al; al = 11; monMessage(); return; findtopictext: _inc(bx); push(es); push(bx); monitorLogo(); scrollMonitor(); bx = pop(); es = pop(); moretopic: monPrint(); al = es.byte(bx); _cmp(al, 34); if (flags.z()) goto endoftopic; _cmp(al, '='); if (flags.z()) goto endoftopic; _cmp(al, '*'); if (flags.z()) goto endoftopic; push(es); push(bx); processTrigger(); cx = 24; randomAccess(); bx = pop(); es = pop(); goto moretopic; endoftopic: scrollMonitor(); } void DreamGenContext::dirFile() { STACK_CHECK; al = 34; es.byte(di) = al; push(es); push(di); ds = data.word(kTextfile1); si = (66*2); searchForString(); _cmp(al, 0); if (flags.z()) goto foundfile; di = pop(); es = pop(); push(es); push(di); ds = data.word(kTextfile2); si = (66*2); searchForString(); _cmp(al, 0); if (flags.z()) goto foundfile; di = pop(); es = pop(); push(es); push(di); ds = data.word(kTextfile3); si = (66*2); searchForString(); _cmp(al, 0); if (flags.z()) goto foundfile; di = pop(); es = pop(); al = 7; monMessage(); return; foundfile: ax = pop(); ax = pop(); getKeyAndLogo(); _cmp(al, 0); if (flags.z()) goto keyok2; return; keyok2: push(es); push(bx); ds = cs; si = offset_operand1+1; es = cs; di = 1120+1; cx = 12; _movsb(cx, true); monitorLogo(); scrollMonitor(); al = 10; monMessage(); bx = pop(); es = pop(); directloop2: al = es.byte(bx); _inc(bx); _cmp(al, 34); if (flags.z()) goto endofdir2; _cmp(al, '*'); if (flags.z()) goto endofdir2; _cmp(al, '='); if (!flags.z()) goto directloop2; monPrint(); goto directloop2; endofdir2: scrollMonitor(); } void DreamGenContext::getKeyAndLogo() { STACK_CHECK; _inc(bx); al = es.byte(bx); _sub(al, 48); data.byte(kNewlogonum) = al; _add(bx, 2); al = es.byte(bx); _sub(al, 48); data.byte(kKeynum) = al; _inc(bx); push(es); push(bx); al = data.byte(kKeynum); ah = 0; cx = 26; _mul(cx); es = cs; bx = offset_keys; _add(bx, ax); al = es.byte(bx); _cmp(al, 1); if (flags.z()) goto keyok; push(bx); push(es); al = 12; monMessage(); es = pop(); bx = pop(); _add(bx, 14); monPrint(); scrollMonitor(); bx = pop(); es = pop(); al = 1; return; keyok: bx = pop(); es = pop(); al = data.byte(kNewlogonum); data.byte(kLogonum) = al; al = 0; } void DreamGenContext::searchForString() { STACK_CHECK; dl = es.byte(di); cx = di; restartlook: di = cx; bx = si; dh = 0; keeplooking: _lodsb(); makeCaps(); _cmp(al, '*'); if (flags.z()) goto notfound; _cmp(dl, '='); if (!flags.z()) goto nofindingtopic; _cmp(al, 34); if (flags.z()) goto notfound; nofindingtopic: ah = es.byte(di); _cmp(al, dl); if (!flags.z()) goto notbracket; _inc(dh); _cmp(dh, 2); if (flags.z()) goto complete; notbracket: _cmp(al, ah); if (!flags.z()) goto restartlook; _inc(di); goto keeplooking; complete: es = ds; al = 0; bx = si; return; notfound: al = 1; } void DreamGenContext::parser() { STACK_CHECK; es = cs; di = offset_operand1; cx = 13; al = 0; _stosb(cx, true); di = offset_operand1; al = '='; _stosb(); ds = cs; si = 1278; notspace1: _lodsw(); _cmp(al, 32); if (flags.z()) goto stillspace1; _cmp(al, 0); if (!flags.z()) goto notspace1; goto finishpars; stillspace1: _lodsw(); _cmp(al, 32); if (flags.z()) goto stillspace1; copyin1: _stosb(); _lodsw(); _cmp(al, 0); if (flags.z()) goto finishpars; _cmp(al, 32); if (!flags.z()) goto copyin1; finishpars: di = offset_operand1; } void DreamGenContext::notHeldError() { STACK_CHECK; createPanel(); showPanel(); showMan(); showExit(); obIcons(); di = 64; bx = 100; al = 63; ah = 1; dl = 201; printmessage2(); workToScreenM(); cx = 50; hangOnP(); putBackObStuff(); } void DreamGenContext::useAltar() { STACK_CHECK; al = 'C'; ah = 'N'; cl = 'D'; ch = 'A'; findExObject(); _cmp(al, (114)); if (flags.z()) goto thingsonaltar; al = 'C'; ah = 'N'; cl = 'D'; ch = 'B'; findExObject(); _cmp(al, (114)); if (flags.z()) goto thingsonaltar; _cmp(data.byte(kCanmovealtar), 1); if (flags.z()) goto movealtar; cx = 300; al = 23; showPuzText(); data.byte(kGetback) = 1; return; movealtar: _inc(data.byte(kProgresspoints)); showSecondUse(); data.word(kWatchingtime) = 160; data.word(kReeltowatch) = 81; data.word(kEndwatchreel) = 174; data.byte(kWatchspeed) = 1; data.byte(kSpeedcount) = 1; al = 47; bl = 52; bh = 76; cx = 32; dx = 98; setupTimedUse(); data.byte(kGetback) = 1; return; thingsonaltar: showFirstUse(); data.byte(kGetback) = 1; } void DreamGenContext::nextColon() { STACK_CHECK; lookcolon: al = es.byte(si); _inc(si); _cmp(al, ':'); if (!flags.z()) goto lookcolon; } void DreamGenContext::drawItAll() { STACK_CHECK; createPanel(); drawFloor(); printSprites(); showIcon(); } void DreamGenContext::useCashCard() { STACK_CHECK; getRidOfReels(); loadKeypad(); createPanel(); showPanel(); showExit(); showMan(); di = 114; bx = 120; _cmp(data.byte(kForeignrelease), 0); if (flags.z()) goto _tmp1; bx = 120-3; _tmp1: ds = data.word(kTempgraphics); al = 39; ah = 0; showFrame(); ax = data.word(kCard1money); moneyPoke(); getObTextStart(); nextColon(); nextColon(); di = 36; bx = 98; dl = 241; al = 0; ah = 0; printDirect(); di = 160; bx = 155; es = cs; si = offset_money1poke; data.word(kCharshift) = 91*2+75; al = 0; ah = 0; dl = 240; printDirect(); di = 187; bx = 155; es = cs; si = offset_money2poke; data.word(kCharshift) = 91*2+85; al = 0; ah = 0; dl = 240; printDirect(); data.word(kCharshift) = 0; workToScreenM(); cx = 400; hangOnP(); getRidOfTemp(); restoreReels(); putBackObStuff(); } void DreamGenContext::lookAtCard() { STACK_CHECK; data.byte(kManisoffscreen) = 1; getRidOfReels(); loadKeypad(); createPanel2(); di = 160; bx = 80; ds = data.word(kTempgraphics); al = 42; ah = 128; showFrame(); getObTextStart(); findNextColon(); findNextColon(); findNextColon(); di = 36; bx = 124; dl = 241; al = 0; ah = 0; printDirect(); push(es); push(si); workToScreenM(); cx = 280; hangOnW(); createPanel2(); di = 160; bx = 80; ds = data.word(kTempgraphics); al = 42; ah = 128; showFrame(); si = pop(); es = pop(); di = 36; bx = 130; dl = 241; al = 0; ah = 0; printDirect(); workToScreenM(); cx = 200; hangOnW(); data.byte(kManisoffscreen) = 0; getRidOfTemp(); restoreReels(); putBackObStuff(); } void DreamGenContext::moneyPoke() { STACK_CHECK; bx = offset_money1poke; cl = 48-1; numberpoke0: _inc(cl); _sub(ax, 10000); if (!flags.c()) goto numberpoke0; _add(ax, 10000); cs.byte(bx) = cl; _inc(bx); cl = 48-1; numberpoke1: _inc(cl); _sub(ax, 1000); if (!flags.c()) goto numberpoke1; _add(ax, 1000); cs.byte(bx) = cl; _inc(bx); cl = 48-1; numberpoke2: _inc(cl); _sub(ax, 100); if (!flags.c()) goto numberpoke2; _add(ax, 100); cs.byte(bx) = cl; _inc(bx); cl = 48-1; numberpoke3: _inc(cl); _sub(ax, 10); if (!flags.c()) goto numberpoke3; _add(ax, 10); cs.byte(bx) = cl; bx = offset_money2poke; _add(al, 48); cs.byte(bx) = al; } void DreamGenContext::useHandle() { STACK_CHECK; al = 'C'; ah = 'U'; cl = 'T'; ch = 'W'; findSetObject(); al = es.byte(bx+58); _cmp(al, 255); if (!flags.z()) goto havecutwire; cx = 300; al = 12; showPuzText(); data.byte(kGetback) = 1; return; havecutwire: cx = 300; al = 13; showPuzText(); data.byte(kNewlocation) = 22; data.byte(kGetback) = 1; } void DreamGenContext::useStereo() { STACK_CHECK; _cmp(data.byte(kLocation), 0); if (flags.z()) goto stereook; cx = 400; al = 4; showPuzText(); putBackObStuff(); return; stereook: _cmp(data.byte(kMapx), 11); if (!flags.z()) goto stereonotok; _cmp(data.byte(kMapy), 0); if (flags.z()) goto stereook2; stereonotok: cx = 400; al = 5; showPuzText(); putBackObStuff(); return; stereook2: al = 'C'; ah = 'D'; cl = 'P'; ch = 'L'; findSetObject(); ah = 1; checkInside(); _cmp(cl, (114)); if (!flags.z()) goto cdinside; al = 6; cx = 400; showPuzText(); putBackObStuff(); getAnyAd(); al = 255; es.byte(bx+10) = al; return; cdinside: getAnyAd(); al = es.byte(bx+10); _xor(al, 1); es.byte(bx+10) = al; _cmp(al, 255); if (flags.z()) goto stereoon; al = 7; cx = 400; showPuzText(); putBackObStuff(); return; stereoon: al = 8; cx = 400; showPuzText(); putBackObStuff(); } void DreamGenContext::withWhat() { STACK_CHECK; createPanel(); showPanel(); showMan(); showExit(); al = data.byte(kCommand); ah = data.byte(kObjecttype); es = cs; di = offset_commandline; copyName(); di = 100; bx = 21; dl = 200; al = 63; ah = 2; printmessage2(); di = data.word(kLastxpos); _add(di, 5); bx = 21; es = cs; si = offset_commandline; dl = 220; al = 0; ah = 0; printDirect(); di = data.word(kLastxpos); _add(di, 5); bx = 21; dl = 200; al = 63; ah = 3; printmessage2(); fillRyan(); data.byte(kCommandtype) = 255; readMouse(); showPointer(); workToScreen(); delPointer(); data.byte(kInvopen) = 2; } void DreamGenContext::selectOb() { STACK_CHECK; findInvPos(); ax = es.word(bx); _cmp(al, 255); if (!flags.z()) goto canselectob; blank(); return; canselectob: data.byte(kWithobject) = al; data.byte(kWithtype) = ah; _cmp(ax, data.word(kOldsubject)); if (!flags.z()) goto diffsub3; _cmp(data.byte(kCommandtype), 221); if (flags.z()) goto alreadyselob; data.byte(kCommandtype) = 221; diffsub3: data.word(kOldsubject) = ax; bx = ax; al = 0; commandWithOb(); alreadyselob: ax = data.word(kMousebutton); _cmp(ax, data.word(kOldbutton)); if (flags.z()) return /* (notselob) */; _and(ax, 1); if (!flags.z()) goto doselob; return; doselob: delPointer(); data.byte(kInvopen) = 0; useRoutine(); } void DreamGenContext::findSetObject() { STACK_CHECK; _sub(al, 'A'); _sub(ah, 'A'); _sub(cl, 'A'); _sub(ch, 'A'); es = data.word(kSetdat); bx = 0; dl = 0; findsetloop: _cmp(al, es.byte(bx+12)); if (!flags.z()) goto nofind; _cmp(ah, es.byte(bx+13)); if (!flags.z()) goto nofind; _cmp(cl, es.byte(bx+14)); if (!flags.z()) goto nofind; _cmp(ch, es.byte(bx+15)); if (!flags.z()) goto nofind; al = dl; return; nofind: _add(bx, 64); _inc(dl); _cmp(dl, 128); if (!flags.z()) goto findsetloop; al = dl; } void DreamGenContext::findExObject() { STACK_CHECK; _sub(al, 'A'); _sub(ah, 'A'); _sub(cl, 'A'); _sub(ch, 'A'); es = data.word(kExtras); bx = (0+2080+30000); dl = 0; findexloop: _cmp(al, es.byte(bx+12)); if (!flags.z()) goto nofindex; _cmp(ah, es.byte(bx+13)); if (!flags.z()) goto nofindex; _cmp(cl, es.byte(bx+14)); if (!flags.z()) goto nofindex; _cmp(ch, es.byte(bx+15)); if (!flags.z()) goto nofindex; al = dl; return; nofindex: _add(bx, 16); _inc(dl); _cmp(dl, (114)); if (!flags.z()) goto findexloop; al = dl; } void DreamGenContext::isRyanHolding() { STACK_CHECK; _sub(al, 'A'); _sub(ah, 'A'); _sub(cl, 'A'); _sub(ch, 'A'); es = data.word(kExtras); bx = (0+2080+30000); dl = 0; searchinv: _cmp(es.byte(bx+2), 4); if (!flags.z()) goto nofindininv; _cmp(al, es.byte(bx+12)); if (!flags.z()) goto nofindininv; _cmp(ah, es.byte(bx+13)); if (!flags.z()) goto nofindininv; _cmp(cl, es.byte(bx+14)); if (!flags.z()) goto nofindininv; _cmp(ch, es.byte(bx+15)); if (!flags.z()) goto nofindininv; al = dl; _cmp(al, (114)); return; nofindininv: _add(bx, 16); _inc(dl); _cmp(dl, (114)); if (!flags.z()) goto searchinv; al = dl; _cmp(al, (114)); } void DreamGenContext::checkInside() { STACK_CHECK; es = data.word(kExtras); bx = (0+2080+30000); cl = 0; insideloop: _cmp(al, es.byte(bx+3)); if (!flags.z()) goto notfoundinside; _cmp(ah, es.byte(bx+2)); if (!flags.z()) goto notfoundinside; return; notfoundinside: _add(bx, 16); _inc(cl); _cmp(cl, (114)); if (!flags.z()) goto insideloop; } void DreamGenContext::findPuzText() { STACK_CHECK; ah = 0; si = ax; _add(si, si); es = data.word(kPuzzletext); ax = es.word(si); _add(ax, (66*2)); si = ax; } void DreamGenContext::useGun() { STACK_CHECK; _cmp(data.byte(kObjecttype), 4); if (flags.z()) goto istakengun; showSecondUse(); putBackObStuff(); return; istakengun: _cmp(data.byte(kReallocation), 22); if (!flags.z()) goto notinpoolroom; cx = 300; al = 34; showPuzText(); data.byte(kLastweapon) = 1; data.byte(kCombatcount) = 39; data.byte(kGetback) = 1; _inc(data.byte(kProgresspoints)); return; notinpoolroom: _cmp(data.byte(kReallocation), 25); if (!flags.z()) goto nothelicopter; cx = 300; al = 34; showPuzText(); data.byte(kLastweapon) = 1; data.byte(kCombatcount) = 19; data.byte(kGetback) = 1; data.byte(kDreamnumber) = 2; data.byte(kRoomafterdream) = 38; data.byte(kSartaindead) = 1; _inc(data.byte(kProgresspoints)); return; nothelicopter: _cmp(data.byte(kReallocation), 27); if (!flags.z()) goto notinrockroom; cx = 300; al = 46; showPuzText(); data.byte(kPointermode) = 2; data.byte(kRockstardead) = 1; data.byte(kLastweapon) = 1; data.byte(kNewsitem) = 1; data.byte(kGetback) = 1; data.byte(kRoomafterdream) = 32; data.byte(kDreamnumber) = 0; _inc(data.byte(kProgresspoints)); return; notinrockroom: _cmp(data.byte(kReallocation), 8); if (!flags.z()) goto notbystudio; _cmp(data.byte(kMapx), 22); if (!flags.z()) goto notbystudio; _cmp(data.byte(kMapy), 40); if (!flags.z()) goto notbystudio; al = 92; isSetObOnMap(); if (flags.z()) goto notbystudio; _cmp(data.byte(kManspath), 9); if (flags.z()) goto notbystudio; data.byte(kDestination) = 9; data.byte(kFinaldest) = 9; autoSetWalk(); data.byte(kLastweapon) = 1; data.byte(kGetback) = 1; _inc(data.byte(kProgresspoints)); return; notbystudio: _cmp(data.byte(kReallocation), 6); if (!flags.z()) goto notsarters; _cmp(data.byte(kMapx), 11); if (!flags.z()) goto notsarters; _cmp(data.byte(kMapy), 20); if (!flags.z()) goto notsarters; al = 5; isSetObOnMap(); if (!flags.z()) goto notsarters; data.byte(kDestination) = 1; data.byte(kFinaldest) = 1; autoSetWalk(); al = 5; removeSetObject(); al = 6; placeSetObject(); al = 1; ah = data.byte(kRoomnum); _dec(ah); turnAnyPathOn(); data.byte(kLiftflag) = 1; data.word(kWatchingtime) = 40*2; data.word(kReeltowatch) = 4; data.word(kEndwatchreel) = 43; data.byte(kWatchspeed) = 1; data.byte(kSpeedcount) = 1; data.byte(kGetback) = 1; _inc(data.byte(kProgresspoints)); return; notsarters: _cmp(data.byte(kReallocation), 29); if (!flags.z()) goto notaide; data.byte(kGetback) = 1; al = 13; resetLocation(); al = 12; setLocation(); data.byte(kDestpos) = 12; data.byte(kDestination) = 2; data.byte(kFinaldest) = 2; autoSetWalk(); data.word(kWatchingtime) = 164*2; data.word(kReeltowatch) = 3; data.word(kEndwatchreel) = 164; data.byte(kWatchspeed) = 1; data.byte(kSpeedcount) = 1; data.byte(kAidedead) = 1; data.byte(kDreamnumber) = 3; data.byte(kRoomafterdream) = 33; _inc(data.byte(kProgresspoints)); return; notaide: _cmp(data.byte(kReallocation), 23); if (!flags.z()) goto notwithboss; _cmp(data.byte(kMapx), 0); if (!flags.z()) goto notwithboss; _cmp(data.byte(kMapy), 50); if (!flags.z()) goto notwithboss; _cmp(data.byte(kManspath), 5); if (flags.z()) goto pathokboss; data.byte(kDestination) = 5; data.byte(kFinaldest) = 5; autoSetWalk(); pathokboss: data.byte(kLastweapon) = 1; data.byte(kGetback) = 1; return; notwithboss: _cmp(data.byte(kReallocation), 8); if (!flags.z()) goto nottvsoldier; _cmp(data.byte(kMapx), 11); if (!flags.z()) goto nottvsoldier; _cmp(data.byte(kMapy), 10); if (!flags.z()) goto nottvsoldier; _cmp(data.byte(kManspath), 2); if (flags.z()) goto pathoktv; data.byte(kDestination) = 2; data.byte(kFinaldest) = 2; autoSetWalk(); pathoktv: data.byte(kLastweapon) = 1; data.byte(kGetback) = 1; return; nottvsoldier: showFirstUse(); putBackObStuff(); } void DreamGenContext::showDiaryKeys() { STACK_CHECK; _cmp(data.byte(kPresscount), 0); if (flags.z()) return /* (nokeyatall) */; _dec(data.byte(kPresscount)); _cmp(data.byte(kPresscount), 0); if (flags.z()) return /* (nokeyatall) */; _cmp(data.byte(kPressed), 'N'); if (!flags.z()) goto nokeyn; al = 3; _cmp(data.byte(kPresscount), 1); if (flags.z()) goto gotkeyn; al = 4; gotkeyn: ah = 0; di = (68+24)+94; bx = (48+12)+97; ds = data.word(kTempgraphics); showFrame(); _cmp(data.byte(kPresscount), 1); if (!flags.z()) return /* (notshown) */; showDiaryPage(); return; nokeyn: al = 5; _cmp(data.byte(kPresscount), 1); if (flags.z()) goto gotkeyp; al = 6; gotkeyp: ah = 0; di = (68+24)+151; bx = (48+12)+71; ds = data.word(kTempgraphics); showFrame(); _cmp(data.byte(kPresscount), 1); if (!flags.z()) return /* (notshowp) */; showDiaryPage(); } void DreamGenContext::dumpDiaryKeys() { STACK_CHECK; _cmp(data.byte(kPresscount), 1); if (!flags.z()) goto notdumpdiary; _cmp(data.byte(kSartaindead), 1); if (flags.z()) goto notsartadd; _cmp(data.byte(kDiarypage), 5); if (!flags.z()) goto notsartadd; _cmp(data.byte(kDiarypage), 5); if (!flags.z()) goto notsartadd; al = 6; getLocation(); _cmp(al, 1); if (flags.z()) goto notsartadd; al = 6; setLocation(); delPointer(); al = 12; findText1(); di = 70; bx = 106; dl = 241; ah = 16; printDirect(); workToScreenM(); cx = 200; hangOnP(); createPanel(); showIcon(); showDiary(); showDiaryPage(); workToScreenM(); showPointer(); return; notsartadd: di = (68+24)+48; bx = (48+12)+15; cl = 200; ch = 16; multiDump(); notdumpdiary: di = (68+24)+94; bx = (48+12)+97; cl = 16; ch = 16; multiDump(); di = (68+24)+151; bx = (48+12)+71; cl = 16; ch = 16; multiDump(); } void DreamGenContext::showDiaryPage() { STACK_CHECK; al = 0; ah = 0; di = (68+24); bx = (48+12); ds = data.word(kTempgraphics); showFrame(); al = data.byte(kDiarypage); findText1(); data.byte(kKerning) = 1; useTempCharset(); di = (68+24)+48; bx = (48+12)+16; dl = 240; ah = 16; data.word(kCharshift) = 91+91; printDirect(); di = (68+24)+129; bx = (48+12)+16; dl = 240; ah = 16; printDirect(); di = (68+24)+48; bx = (48+12)+23; dl = 240; ah = 16; printDirect(); data.byte(kKerning) = 0; data.word(kCharshift) = 0; useCharset1(); } void DreamGenContext::findText1() { STACK_CHECK; ah = 0; si = ax; _add(si, si); es = data.word(kTextfile1); ax = es.word(si); _add(ax, (66*2)); si = ax; } void DreamGenContext::showSlots() { STACK_CHECK; di = (60)+7; bx = (52)+8; al = 2; ds = data.word(kTempgraphics); ah = 0; showFrame(); di = (60)+10; bx = (52)+11; cl = 0; slotloop: push(cx); push(di); push(bx); _cmp(cl, data.byte(kCurrentslot)); if (!flags.z()) goto nomatchslot; al = 3; ds = data.word(kTempgraphics); ah = 0; showFrame(); nomatchslot: bx = pop(); di = pop(); cx = pop(); _add(bx, 10); _inc(cl); _cmp(cl, 7); if (!flags.z()) goto slotloop; } void DreamGenContext::clearBuffers() { STACK_CHECK; es = data.word(kBuffers); cx = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)+911-454+68-0)/2; ax = 0; di = 0; _stosw(cx, true); es = data.word(kExtras); cx = (0+2080+30000+(16*114)+((114+2)*2)+18000)/2; ax = 0x0ffff; di = 0; _stosw(cx, true); es = data.word(kBuffers); di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)); ds = cs; si = 454; cx = (911-454); _movsb(cx, true); es = data.word(kBuffers); di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)+911-454); ds = cs; si = 0; cx = (68-0); _movsb(cx, true); clearChanges(); } void DreamGenContext::clearChanges() { STACK_CHECK; es = data.word(kBuffers); cx = (250)*2; ax = 0x0ffff; di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)); _stosw(cx, true); ds = data.word(kBuffers); si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)); es = cs; di = 454; cx = (911-454); _movsb(cx, true); ds = data.word(kBuffers); si = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)+(6*64)+911-454); es = cs; di = 0; cx = (68-0); _movsb(cx, true); data.byte(kExpos) = 0; data.word(kExframepos) = 0; data.word(kExtextpos) = 0; es = data.word(kExtras); cx = (0+2080+30000+(16*114)+((114+2)*2)+18000)/2; ax = 0x0ffff; di = 0; _stosw(cx, true); es = cs; di = 1244; al = 1; _stosb(2); al = 0; _stosb(); al = 1; _stosb(); ax = 0; cx = 6; _stosw(cx, true); } void DreamGenContext::identifyOb() { STACK_CHECK; _cmp(data.word(kWatchingtime), 0); if (!flags.z()) { blank(); return; }; ax = data.word(kMousex); _sub(ax, data.word(kMapadx)); _cmp(ax, 22*8); if (flags.c()) goto notover1; blank(); return; notover1: bx = data.word(kMousey); _sub(bx, data.word(kMapady)); _cmp(bx, 20*8); if (flags.c()) goto notover2; blank(); return; notover2: data.byte(kInmaparea) = 1; ah = bl; push(ax); findPathOfPoint(); data.byte(kPointerspath) = dl; ax = pop(); push(ax); findFirstPath(); data.byte(kPointerfirstpath) = al; ax = pop(); checkIfEx(); if (!flags.z()) return /* (finishidentify) */; checkIfFree(); if (!flags.z()) return /* (finishidentify) */; checkIfPerson(); if (!flags.z()) return /* (finishidentify) */; checkIfSet(); if (!flags.z()) return /* (finishidentify) */; ax = data.word(kMousex); _sub(ax, data.word(kMapadx)); cl = al; ax = data.word(kMousey); _sub(ax, data.word(kMapady)); ch = al; checkOne(); _cmp(al, 0); if (flags.z()) goto nothingund; _cmp(data.byte(kMandead), 1); if (flags.z()) goto nothingund; ah = 3; obName(); return; nothingund: blank(); } void DreamGenContext::findPathOfPoint() { STACK_CHECK; push(ax); bx = (0); es = data.word(kReels); al = data.byte(kRoomnum); ah = 0; cx = 144; _mul(cx); _add(bx, ax); cx = pop(); dl = 0; pathloop: al = es.byte(bx+6); _cmp(al, 255); if (!flags.z()) goto flunkedit; ax = es.word(bx+2); _cmp(ax, 0x0ffff); if (flags.z()) goto flunkedit; _cmp(cl, al); if (flags.c()) goto flunkedit; _cmp(ch, ah); if (flags.c()) goto flunkedit; ax = es.word(bx+4); _cmp(cl, al); if (!flags.c()) goto flunkedit; _cmp(ch, ah); if (!flags.c()) goto flunkedit; return /* (gotvalidpath) */; flunkedit: _add(bx, 8); _inc(dl); _cmp(dl, 12); if (!flags.z()) goto pathloop; dl = 255; } void DreamGenContext::findFirstPath() { STACK_CHECK; push(ax); bx = (0); es = data.word(kReels); al = data.byte(kRoomnum); ah = 0; cx = 144; _mul(cx); _add(bx, ax); cx = pop(); dl = 0; fpathloop: ax = es.word(bx+2); _cmp(ax, 0x0ffff); if (flags.z()) goto nofirst; _cmp(cl, al); if (flags.c()) goto nofirst; _cmp(ch, ah); if (flags.c()) goto nofirst; ax = es.word(bx+4); _cmp(cl, al); if (!flags.c()) goto nofirst; _cmp(ch, ah); if (!flags.c()) goto nofirst; goto gotfirst; nofirst: _add(bx, 8); _inc(dl); _cmp(dl, 12); if (!flags.z()) goto fpathloop; al = 0; return; gotfirst: al = es.byte(bx+6); } void DreamGenContext::printmessage2() { STACK_CHECK; push(dx); push(bx); push(di); push(ax); ah = 0; _add(ax, ax); bx = ax; es = data.word(kCommandtext); ax = es.word(bx); _add(ax, (66*2)); si = ax; ax = pop(); searchmess: push(ax); findNextColon(); ax = pop(); _dec(ah); if (!flags.z()) goto searchmess; di = pop(); bx = pop(); dx = pop(); al = 0; ah = 0; printDirect(); } void DreamGenContext::__start() { static const uint8 src[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0000: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, //0x0010: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0020: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0xff, 0x00, //0x0030: .... .... .... .... 0xff, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0xb6, //0x0040: ...0 .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0050: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0060: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0070: .... ...h .&.. .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0080: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0090: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x00a0: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, //0x00b0: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x00c0: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x00d0: .... .... .... .... 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x00e0: .. .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x00f0: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0100: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0110: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0120: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0130: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0140: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0150: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0160: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, //0x0170: .... .... .... .... 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //0x0180: .... .... .... .... 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //0x0190: .... .... .... .... 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x01a0: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, //0x01b0: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x2c, 0x00, 0x14, 0x00, 0x02, 0x00, 0x01, 0x01, 0x37, //0x01c0: .... ..., .... ...7 0x00, 0x00, 0x00, 0x32, 0x14, 0x00, 0x18, 0x16, 0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x18, 0x21, //0x01d0: ...2 .... .J.. ...! 0x0a, 0x4b, 0x00, 0x01, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x1b, 0x00, 0x02, 0x00, 0x02, 0x01, 0x2c, //0x01e0: .K.. ..., .... ..., 0x00, 0x60, 0x00, 0x03, 0x00, 0x04, 0x01, 0x2c, 0x00, 0x76, 0x00, 0x02, 0x00, 0x05, 0x01, 0x2c, //0x01f0: .`.. ..., .v.. ..., 0x0a, 0x00, 0x00, 0x02, 0x00, 0x00, 0x05, 0x16, 0x14, 0x35, 0x00, 0x03, 0x00, 0x00, 0x05, 0x16, //0x0200: .... .... .5.. .... 0x14, 0x28, 0x00, 0x01, 0x00, 0x02, 0x05, 0x16, 0x14, 0x32, 0x00, 0x01, 0x00, 0x03, 0x02, 0x0b, //0x0210: .(.. .... .2.. .... 0x0a, 0xc0, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0b, 0x0a, 0xb6, 0x00, 0x02, 0x00, 0x01, 0x08, 0x0b, //0x0220: .... .... .... .... 0x0a, 0x00, 0x00, 0x02, 0x00, 0x01, 0x17, 0x00, 0x32, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1c, 0x0b, //0x0230: .... .... 2... .... 0x14, 0xfa, 0x00, 0x04, 0x00, 0x00, 0x17, 0x00, 0x32, 0x2b, 0x00, 0x02, 0x00, 0x08, 0x17, 0x0b, //0x0240: .... .... 2+.. .... 0x28, 0x82, 0x00, 0x02, 0x00, 0x01, 0x17, 0x16, 0x28, 0x7a, 0x00, 0x02, 0x00, 0x02, 0x17, 0x16, //0x0250: (... .... (z.. .... 0x28, 0x69, 0x00, 0x02, 0x00, 0x03, 0x17, 0x16, 0x28, 0x51, 0x00, 0x02, 0x00, 0x04, 0x17, 0x0b, //0x0260: (i.. .... (Q.. .... 0x28, 0x87, 0x00, 0x02, 0x00, 0x05, 0x17, 0x16, 0x28, 0x91, 0x00, 0x02, 0x00, 0x06, 0x04, 0x16, //0x0270: (... .... (... .... 0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x2d, 0x16, 0x1e, 0xc8, 0x00, 0x00, 0x00, 0x14, 0x2d, 0x16, //0x0280: .... ..-. .... ..-. 0x1e, 0x27, 0x00, 0x02, 0x00, 0x00, 0x2d, 0x16, 0x1e, 0x19, 0x00, 0x02, 0x00, 0x00, 0x08, 0x16, //0x0290: .'.. ..-. .... .... 0x28, 0x20, 0x00, 0x02, 0x00, 0x00, 0x07, 0x0b, 0x14, 0x40, 0x00, 0x02, 0x00, 0x00, 0x16, 0x16, //0x02a0: ( .. .... .@.. .... 0x14, 0x52, 0x00, 0x02, 0x00, 0x00, 0x1b, 0x0b, 0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0x00, //0x02b0: .R.. .... .... .... 0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0e, 0x21, 0x28, 0x15, 0x00, 0x01, 0x00, 0x00, 0x1d, 0x0b, //0x02c0: .... ...! (... .... 0x0a, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x19, 0x00, //0x02d0: .... .... .... .... 0x32, 0x04, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, 0x1e, 0x79, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, //0x02e0: 2... ..2. .y.. ..2. 0x1e, 0x00, 0x00, 0x14, 0x00, 0x00, 0x34, 0x16, 0x1e, 0xc0, 0x00, 0x02, 0x00, 0x00, 0x34, 0x16, //0x02f0: .... ..4. .... ..4. 0x1e, 0xe9, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, 0x28, 0x68, 0x00, 0x37, 0x00, 0x00, 0x35, 0x21, //0x0300: .... ..2. (h.7 ..5! 0x00, 0x63, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, 0x28, 0x00, 0x00, 0x03, 0x00, 0x00, 0x32, 0x16, //0x0310: .c.. ..2. (... ..2. 0x1e, 0xa2, 0x00, 0x02, 0x00, 0x00, 0x34, 0x16, 0x1e, 0x39, 0x00, 0x02, 0x00, 0x00, 0x34, 0x16, //0x0320: .... ..4. .9.. ..4. 0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x36, 0x00, 0x00, 0x48, 0x00, 0x03, 0x00, 0x00, 0x37, 0x2c, //0x0330: .... ..6. .H.. ..7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0e, 0x16, //0x0340: .... .... .... .... 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x0e, 0x16, 0x00, 0x2c, 0x01, 0x01, 0x00, 0x00, 0x0a, 0x16, //0x0350: .... .... .,.. .... 0x1e, 0xae, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x16, 0x14, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0b, 0x0b, //0x0360: .... .... .... .... 0x14, 0x00, 0x00, 0x32, 0x14, 0x00, 0x0b, 0x0b, 0x1e, 0x00, 0x00, 0x32, 0x14, 0x00, 0x0b, 0x16, //0x0370: ...2 .... ...2 .... 0x14, 0x00, 0x00, 0x32, 0x14, 0x00, 0x0e, 0x21, 0x28, 0x00, 0x00, 0x32, 0x14, 0x00, 0xff, 0x44, //0x0380: ...2 ...! (..2 ...D 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x56, 0x39, 0x39, 0x00, 0x00, 0x01, 0x45, 0x58, //0x0390: REAM WEB. V99. ..EX 0x49, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x45, 0x4c, 0x50, 0x20, 0x20, 0x20, 0x20, //0x03a0: IT HELP 0x20, 0x20, 0x4c, 0x49, 0x53, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x45, 0x41, 0x44, //0x03b0: LI ST READ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x4f, 0x47, 0x4f, 0x4e, 0x20, 0x20, 0x20, 0x20, 0x20, //0x03c0: LO GON 0x4b, 0x45, 0x59, 0x53, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x50, 0x55, 0x42, 0x4c, //0x03d0: KEYS .. PUBL 0x49, 0x43, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x20, //0x03e0: IC PUBL IC 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x42, 0x4c, 0x41, 0x43, 0x4b, 0x44, 0x52, 0x41, 0x47, 0x4f, //0x03f0: . ..BL ACKD RAGO 0x4e, 0x20, 0x52, 0x59, 0x41, 0x4e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, //0x0400: N RY AN ... 0x48, 0x45, 0x4e, 0x44, 0x52, 0x49, 0x58, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x4f, 0x55, 0x49, //0x0410: HEND RIX LOUI 0x53, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x53, 0x45, 0x50, 0x54, 0x49, 0x4d, //0x0420: S . ..SE PTIM 0x55, 0x53, 0x20, 0x20, 0x20, 0x20, 0x42, 0x45, 0x43, 0x4b, 0x45, 0x54, 0x54, 0x20, 0x20, 0x20, //0x0430: US BE CKET T 0x20, 0x00, 0xff, 0xff, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, //0x0440: ... 0x20, 0x00, 0x22, 0x52, 0x4f, 0x4f, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, //0x0450: ."R OOT . 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x30, 0x30, //0x0460: " .00 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x0d, 0x0a, 0x0d, 0x0a, 0x24, 0x4f, 0x42, 0x4a, 0x45, 0x43, //0x0470: 00.0 0... ..$O BJEC 0x54, 0x20, 0x4e, 0x41, 0x4d, 0x45, 0x20, 0x4f, 0x4e, 0x45, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, //0x0480: T NA ME O NE 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, //0x0490: 0x20, 0x20, 0x20, 0x00, 0x10, 0x12, 0x12, 0x11, 0x10, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, //0x04a0: . .... .... .... 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x44, 0x3a, 0x00, 0x00, //0x04b0: .... .... .... D:.. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x04c0: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, //0x04d0: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x02, //0x04e0: .... .... .... .... 0x04, 0x01, 0x0a, 0x09, 0x08, 0x06, 0x0b, 0x04, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x04f0: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0500: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0510: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0520: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0530: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0540: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0550: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x0560: .... .... .... .... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, //0x0570: .... .... .... .... 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, }; ds.assign(src, src + sizeof(src)); dreamweb(); } } // End of namespace DreamGen