From ee336e05f55ac5b01c31a7cc48c294ddc6898304 Mon Sep 17 00:00:00 2001 From: Sean Cross Date: Mon, 11 Dec 2023 15:15:19 +0800 Subject: [PATCH] add zork game Signed-off-by: Sean Cross --- lib/co/index.js | 239 +++++++++++++++ lib/zork/index.d.ts | 98 ++++++ lib/zork/index.js | 1 + lib/zork/jszm.js | 682 +++++++++++++++++++++++++++++++++++++++++ src/interface/debug.ts | 50 ++- static/zork1.z3 | Bin 0 -> 86838 bytes tsconfig.json | 2 +- 7 files changed, 1067 insertions(+), 5 deletions(-) create mode 100644 lib/co/index.js create mode 100644 lib/zork/index.d.ts create mode 100644 lib/zork/index.js create mode 100644 lib/zork/jszm.js create mode 100644 static/zork1.z3 diff --git a/lib/co/index.js b/lib/co/index.js new file mode 100644 index 0000000..aacf6ef --- /dev/null +++ b/lib/co/index.js @@ -0,0 +1,239 @@ + +/** + * slice() reference. + */ + +var slice = Array.prototype.slice; + +/** + * Expose `co`. + */ + +module.exports = co['default'] = co.co = co; + +/** + * Wrap the given generator `fn` into a + * function that returns a promise. + * This is a separate function so that + * every `co()` call doesn't create a new, + * unnecessary closure. + * + * @param {GeneratorFunction} fn + * @return {Function} + * @api public + */ + +co.wrap = function (fn) { + createPromise.__generatorFunction__ = fn; + return createPromise; + function createPromise() { + return co.call(this, fn.apply(this, arguments)); + } +}; + +/** + * Execute the generator function or a generator + * and return a promise. + * + * @param {Function} fn + * @return {Promise} + * @api public + */ + +function co(gen) { + var ctx = this; + var args = slice.call(arguments, 1); + + // we wrap everything in a promise to avoid promise chaining, + // which leads to memory leak errors. + // see https://github.com/tj/co/issues/180 + return new Promise(function(resolve, reject) { + if (typeof gen === 'function') gen = gen.apply(ctx, args); + if (!gen || typeof gen.next !== 'function') return resolve(gen); + + onFulfilled(); + + /** + * @param {Mixed} res + * @return {Promise} + * @api private + */ + + function onFulfilled(res) { + var ret; + try { + ret = gen.next(res); + } catch (e) { + return reject(e); + } + next(ret); + return null; + } + + /** + * @param {Error} err + * @return {Promise} + * @api private + */ + + function onRejected(err) { + var ret; + try { + ret = gen.throw(err); + } catch (e) { + return reject(e); + } + next(ret); + } + + /** + * Get the next value in the generator, + * return a promise. + * + * @param {Object} ret + * @return {Promise} + * @api private + */ + + function next(ret) { + if (ret.done) return resolve(ret.value); + var value = toPromise.call(ctx, ret.value); + if (value && isPromise(value)) return value.then(onFulfilled, onRejected); + return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, ' + + 'but the following object was passed: "' + String(ret.value) + '"')); + } + }); +} + +/** + * Convert a `yield`ed value into a promise. + * + * @param {Mixed} obj + * @return {Promise} + * @api private + */ + +function toPromise(obj) { + if (!obj) return obj; + if (isPromise(obj)) return obj; + if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj); + if ('function' == typeof obj) return thunkToPromise.call(this, obj); + if (Array.isArray(obj)) return arrayToPromise.call(this, obj); + if (isObject(obj)) return objectToPromise.call(this, obj); + return obj; +} + +/** + * Convert a thunk to a promise. + * + * @param {Function} + * @return {Promise} + * @api private + */ + +function thunkToPromise(fn) { + var ctx = this; + return new Promise(function (resolve, reject) { + fn.call(ctx, function (err, res) { + if (err) return reject(err); + if (arguments.length > 2) res = slice.call(arguments, 1); + resolve(res); + }); + }); +} + +/** + * Convert an array of "yieldables" to a promise. + * Uses `Promise.all()` internally. + * + * @param {Array} obj + * @return {Promise} + * @api private + */ + +function arrayToPromise(obj) { + return Promise.all(obj.map(toPromise, this)); +} + +/** + * Convert an object of "yieldables" to a promise. + * Uses `Promise.all()` internally. + * + * @param {Object} obj + * @return {Promise} + * @api private + */ + +function objectToPromise(obj){ + var results = new obj.constructor(); + var keys = Object.keys(obj); + var promises = []; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var promise = toPromise.call(this, obj[key]); + if (promise && isPromise(promise)) defer(promise, key); + else results[key] = obj[key]; + } + return Promise.all(promises).then(function () { + return results; + }); + + function defer(promise, key) { + // predefine the key in the result + results[key] = undefined; + promises.push(promise.then(function (res) { + results[key] = res; + })); + } +} + +/** + * Check if `obj` is a promise. + * + * @param {Object} obj + * @return {Boolean} + * @api private + */ + +function isPromise(obj) { + return 'function' == typeof obj.then; +} + +/** + * Check if `obj` is a generator. + * + * @param {Mixed} obj + * @return {Boolean} + * @api private + */ + +function isGenerator(obj) { + return 'function' == typeof obj.next && 'function' == typeof obj.throw; +} + +/** + * Check if `obj` is a generator function. + * + * @param {Mixed} obj + * @return {Boolean} + * @api private + */ + +function isGeneratorFunction(obj) { + var constructor = obj.constructor; + if (!constructor) return false; + if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true; + return isGenerator(constructor.prototype); +} + +/** + * Check for plain object. + * + * @param {Mixed} val + * @return {Boolean} + * @api private + */ + +function isObject(val) { + return Object == val.constructor; +} diff --git a/lib/zork/index.d.ts b/lib/zork/index.d.ts new file mode 100644 index 0000000..d87b0c0 --- /dev/null +++ b/lib/zork/index.d.ts @@ -0,0 +1,98 @@ +declare class JSZM { + constructor(arr: ArrayLike); + + /** + * A generator function you define, which will be called to update the highlighting mode. + * fixpitch (if the argument is true) or normal (if argument is false). + */ + highlight(fixpitch: boolean): void; + + /** Normally false. Set it to true to tell the game that it is a Tandy computer; this affects some games. */ + isTandy: boolean; + + /** + * A generator function that you must define that will be called to print text. You must implement + * wrapping, buffering and scripting yourself. The second argument is true if it should be + * copied to the transcript or false if it should not be. + */ + print(text: string, scripting: boolean): void; + + /** + * A generator function which you must define which should return a string containing the player's input. + * Called when a READ instruction is executed. The argument is the maximum number of characters that are + * allowed (if you return a longer string, it will be truncated) + */ + read(maxlen: number): void; + + /** + * A generator function you can optionally define. When the game starts or if restarted (with the RESTART + * instruction), it will be called after memory is initialized but before executing any more. + */ + restarted(): void; + + /** + * A generator function you define, which is called when restoring a saved game. Return a Uint8Array with + * the same contents passed to save() if successful, or you can return false or null or undefined if it failed. + */ + restore(): void; + + /** + * A generator function. Call it to run the program from the beginning, and call the next() method of the + * returned object to begin and to continue. This generator may call your own generator functions which + * may yield; it doesn't otherwise yield by itself. You must set up the other methods before calling run + * so that it can properly set up the contents of the Z-machine mode byte. + * + * This generator only finishes when a QUIT instruction is executed. + */ + run(): IterableIterator; + + /** + * A generator function you can define yourself, and is called when saving the game. The argument is a Uint8Array, + * and you should attempt to save its contents somewhere, and then return true if successful or false if it failed. + */ + save(buf: Uint8Array): void; + + /** The serial number of the story file, as six ASCII characters. */ + serial: string; + + /** + * Normally null. You can set it to a generator function which will be called when the SCREEN opcode is executed if + * you want to implement split screen. + */ + screen(window: number): void; + + /** + * Normally null. You can set it to a generator function which will be called when the SPLIT opcode is executed if + * you want to implement split screen. + */ + split(height: number): void; + + /** + * False for score/moves and true for hours/minutes. Use this to determine the meaning of arguments to updateStatusLine. + */ + statusType: boolean; + + /** + * Normally null, but can be a generator function if you are implementing the status line. It is called when a READ or + * USL instruction is executed. See statusType for the meaning of v18 and v17. Return value is unused. + */ + updateStatusLine(text: string, v18: number, v17: number): void; + + /** + * A normal function. Calling it will attempt to verify the story file, and returns true if successful or false on error. + * You can override it with your own verification function if you want to. + */ + verify(): void; + + /** The ZORKID of the story file. This is what is normally displayed as the release number. */ + zorkid: number; + + static version: { + major: number; + minor: number; + subminor: number; + timestamp: number; + }; +} + +export = JSZM; \ No newline at end of file diff --git a/lib/zork/index.js b/lib/zork/index.js new file mode 100644 index 0000000..d798ab8 --- /dev/null +++ b/lib/zork/index.js @@ -0,0 +1 @@ +module.exports = require('./jszm') \ No newline at end of file diff --git a/lib/zork/jszm.js b/lib/zork/jszm.js new file mode 100644 index 0000000..dbd44ab --- /dev/null +++ b/lib/zork/jszm.js @@ -0,0 +1,682 @@ +/* + JSZM - JavaScript implementation of Z-machine + This program is in public domain. + + Documentation: + + The exported function called JSZM is the constructor, which takes a + Uint8Array as input. You can also use JSZM.Version for the version + number which is object with properties: major, minor, subminor, + timestamp. Properties of JSZM instances are: + + .highlight(fixpitch) = A generator function you define, which will be + called to update the highlighting mode, which is fixpitch (if the + argument is true) or normal (if argument is false). (You don't have to + set it if you aren't implementing variable pitch by default.) + + .isTandy = A boolean, normally false. Set it to true to tell the game + that it is a Tandy computer; this affects some games. + + .print(text,scripting) = A generator function that you must define, and + will be called to print text. You must implement wrapping and buffering + and scripting yourself. The second argument is true if it should be + copied to the transcript or false if it should not be. + + .read(maxlen) = A generator function which you must define yourself, and + which should return a string containing the player's input. Called when + a READ instruction is executed; the argument is the maximum number of + characters that are allowed (if you return a longer string, it will be + truncated). + + .restarted() = A generator function you can optionally define. When the + game starts or if restarted (with the RESTART instruction), it will be + called after memory is initialized but before executing any more. + + .restore() = A generator function you can define yourself, which is + called when restoring a saved game. Return a Uint8Array with the same + contents passed to save() if successful, or you can return false or null + or undefined if it failed. + + .run() = A generator function. Call it to run the program from the + beginning, and call the next() method of the returned object to begin + and to continue. This generator may call your own generator functions + which may yield; it doesn't otherwise yield by itself. You must set up + the other methods before calling run so that it can properly set up the + contents of the Z-machine mode byte. This generator only finishes when a + QUIT instruction is executed. + + .save(buf) = A generator function you can define yourself, and is called + when saving the game. The argument is a Uint8Array, and you should + attempt to save its contents somewhere, and then return true if + successful or false if it failed. + + .serial = The serial number of the story file, as six ASCII characters. + + .screen(window) = Normally null. You can set it to a generator function + which will be called when the SCREEN opcode is executed if you want to + implement split screen. + + .split(height) = Normally null. You can set it to a generator function + which will be called when the SPLIT opcode is executed if you want to + implement split screen. + + .statusType = False for score/moves and true for hours/minutes. Use this + to determine the meaning of arguments to updateStatusLine. + + .updateStatusLine(text,v18,v17) = Normally null, but can be a generator + function if you are implementing the status line. It is called when a + READ or USL instruction is executed. See statusType for the meaning of + v18 and v17. Return value is unused. + + .verify() = A normal function. Calling it will attempt to verify the + story file, and returns true if successful or false on error. You can + override it with your own verification function if you want to. + + .zorkid = The ZORKID of the story file. This is what is normally + displayed as the release number. +*/ + +"use strict"; + +const JSZM_Version={major:2,minor:0,subminor:2,timestamp:1480624305074}; + +function JSZM(arr) { + var mem; + mem=this.memInit=new Uint8Array(arr); + if(mem[0]!=3) throw new Error("Unsupported Z-code version."); + this.byteSwapped=!!(mem[1]&1); + this.statusType=!!(mem[1]&2); + this.serial=String.fromCharCode(...mem.slice(18,24)); + this.zorkid=(mem[2]<<(this.byteSwapped?0:8))|(mem[3]<<(this.byteSwapped?8:0)); +} + +JSZM.prototype={ + byteSwapped: false, + constructor: JSZM, + deserialize: function(ar) { + var e,i,j,ds,cs,pc,vi,purbot; + var g8,g16s,g16,g24,g32; + g8=()=>ar[e++]; + g16s=()=>(e+=2,vi.getInt16(e-2)); + g16=()=>(e+=2,vi.getUint16(e-2)); + g24=()=>(e+=3,vi.getUint32(e-4)&0xFFFFFF); + g32=()=>(e+=4,vi.getUint32(e-4)); + try { + e=purbot=this.getu(14); + vi=new DataView(ar.buffer); + if(ar[2]!=this.mem[2] || ar[3]!=this.mem[3]) return null; // ZORKID does not match + pc=g32(); + cs=new Array(g16()); + ds=Array.from({length:g16()},g16s); + for(i=0;i { + if(ts==3) { + y=v<<5; + ts=4; + } else if(ts==4) { + y+=v; + if(y==13) o+="\n"; + else if(y) o+=String.fromCharCode(y); + ts=ps; + } else if(ts==5) { + o+=this.getText(this.getu(this.fwords+(y+v)*2)*2); + ts=ps; + } else if(v==0) { + o+=" "; + } else if(v<4) { + ts=5; + y=(v-1)*32; + } else if(v<6) { + if(!ts) ts=v-3; + else if(ts==v-3) ps=ts; + else ps=ts=0; + } else if(v==6 && ts==2) { + ts=3; + } else { + o+="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*\n0123456789.,!?_#'\"/\\-:()"[ts*26+v-6]; + ts=ps; + } + }; + for(;;) { + w=this.getu(addr); + addr+=2; + d((w>>10)&31); + d((w>>5)&31); + d(w&31); + if(w&32768) break; + } + this.endText=addr; + return o; + }, + getu: function(x) { return this.view.getUint16(x,this.byteSwapped); }, + handleInput: function(str,t1,t2) { + var i,br,w; + // Put text + str=str.toLowerCase().slice(0,this.mem[t1]-1); + for(i=0;i(i=0,x.split("").filter(y => (i+=/[a-z]/.test(y)?1:/[0-9.,!?_#'"\/\\:\-()]/.test(y)?2:4)<7).join("")); + br=JSON.parse("["+str.replace(this.regBreak,(m,o)=>",["+(m.length)+","+(this.vocabulary.get(w(m))||0)+","+(o+1)+"]").slice(1)+"]"); + i=this.mem[t2+1]=br.length; + while(i--) { + this.putu(t2+i*4+2,br[i][1]); + this.mem[t2+i*4+4]=br[i][0]; + this.mem[t2+i*4+5]=br[i][2]; + } + }, + highlight: ()=>[], + isTandy: false, + mem: null, + memInit: null, + parseVocab: function(s) { + this.vocabulary=new Map(); + + if (s === 0) { // If the story file does not contain a dictionary.. + this.regBreak=new RegExp("[^ \\n\\t]+","g"); // use the default word separators + return; // and early exit. + } + + var e; + var n; + n=this.mem[s++]; + e=this.selfInsertingBreaks=String.fromCharCode(...this.mem.slice(s,s+n)); + e=e.split("").map(x=>(x.toUpperCase()==x.toLowerCase()?"":"\\")+x).join("")+"]"; + this.regBreak=new RegExp("["+e+"|[^ \\n\\t"+e+"+","g"); + s+=n; + e=this.mem[s++]; + n=this.get(s); + s+=2; + while(n--) { + this.vocabulary.set(this.getText(s),s); + s+=e; + } + }, + print: ()=>[], + put: function(x,y) { return this.view.setInt16(x,y,this.byteSwapped); }, + putu: function(x,y) { return this.view.setUint16(x,y&65535,this.byteSwapped); }, + read: ()=>[], + regBreak: null, + restarted: ()=>[], + restore: ()=>[], + run: function*() { + var mem,pc,cs,ds,op0,op1,op2,op3,opc,inst,x,y,z; + var globals,objects,fwords,defprop; + var addr,fetch,flagset,init,move,opfetch,pcfetch,pcget,pcgetb,pcgetu,predicate,propfind,ret,store,xfetch,xstore; + + // Functions + addr=(x) => (x&65535)<<1; + fetch=(x) => { + if(x==0) return ds.pop(); + if(x<16) return cs[0].local[x-1]; + return this.get(globals+2*x); + }; + flagset=() => { + op3=1<<(15&~op1); + op2=objects+op0*9+(op1&16?2:0); + opc=this.get(op2); + }; + const initRng = () => { + this.seed = (Math.random() * 0xFFFFFFFF) >>> 0; + }; + init=() => { + mem=this.mem=new Uint8Array(this.memInit); + this.view=new DataView(mem.buffer); + mem[1]&=3; + if(this.isTandy) mem[1]|=8; + if(!this.updateStatusLine) mem[1]|=16; + if(this.screen && this.split) mem[1]|=32; + this.put(16,this.savedFlags); + if(!this.vocabulary) this.parseVocab(this.getu(8)); + defprop=this.getu(10)-2; + globals=this.getu(12)-32; + this.fwords=fwords=this.getu(24); + cs=[]; + ds=[]; + pc=this.getu(6); + objects=defprop+55; + initRng(); + }; + move=(x,y) => { + var w,z; + // Remove from old FIRST-NEXT chain + if(z=mem[objects+x*9+4]) { + if(mem[objects+z*9+6]==x) { // is x.loc.first=x? + mem[objects+z*9+6]=mem[objects+x*9+5]; // x.loc.first=x.next + } else { + z=mem[objects+z*9+6]; // z=x.loc.first + while(z!=x) { + w=z; + z=mem[objects+z*9+5]; // z=z.next + } + mem[objects+w*9+5]=mem[objects+x*9+5]; // w.next=x.next + } + } + // Insert at beginning of new FIRST-NEXT chain + if(mem[objects+x*9+4]=y) { // x.loc=y + mem[objects+x*9+5]=mem[objects+y*9+6]; // x.next=y.first + mem[objects+y*9+6]=x; // y.first=x + } else { + mem[objects+x*9+5]=0; // x.next=0 + } + }; + opfetch=(x,y) => { + if((x&=3)==3) return; + opc=y; + return [pcget,pcgetb,pcfetch][x](); + }; + pcfetch=(x) => fetch(mem[pc++]); + pcget=() => { + pc+=2; + return this.get(pc-2); + }; + pcgetb=() => mem[pc++]; + pcgetu=() => { + pc+=2; + return this.getu(pc-2); + }; + predicate=(p) => { + var x=pcgetb(); + if(x&128) p=!p; + if(x&64) x&=63; else x=((x&63)<<8)|pcgetb(); + if(p) return; + if(x==0 || x==1) return ret(x); + if(x&0x2000) x-=0x4000; + pc+=x-2; + }; + propfind=() => { + var z=this.getu(objects+op0*9+7); + z+=mem[z]*2+1; + while(mem[z]) { + if((mem[z]&31)==op1) { + op3=z+1; + return true; + } else { + z+=(mem[z]>>5)+2; + } + } + op3=0; + return false; + }; + ret=(x) => { + ds=cs[0].ds; + pc=cs[0].pc; + cs.shift(); + store(x); + }; + store=(y) => { + var x=pcgetb(); + if(x==0) ds.push(y); + else if(x<16) cs[0].local[x-1]=y; + else this.put(globals+2*x,y); + }; + xfetch=(x) => { + if(x==0) return ds[ds.length-1]; + if(x<16) return cs[0].local[x-1]; + return this.get(globals+2*x); + }; + xstore=(x,y) => { + if(x==0) ds[ds.length-1]=y; + else if(x<16) cs[0].local[x-1]=y; + else this.put(globals+2*x,y); + }; + + // Initializations + init(); + yield*this.restarted(); + yield*this.highlight(!!(this.savedFlags&2)); + + // Main loop + main: for(;;) { + inst=pcgetb(); + if(inst<128) { + // 2OP + if(inst&64) op0=pcfetch(); else op0=pcgetb(); + if(inst&32) op1=pcfetch(); else op1=pcgetb(); + inst&=31; + opc=2; + } else if(inst<176) { + // 1OP + x=(inst>>4)&3; + inst&=143; + if(x==0) op0=pcget(); + else if(x==1) op0=pcgetb(); + else if(x==2) op0=pcfetch(); + } else if(inst>=192) { + // EXT + x=pcgetb(); + op0=opfetch(x>>6,1); + op1=opfetch(x>>4,2); + op2=opfetch(x>>2,3); + op3=opfetch(x>>0,4); + if(inst<224) inst&=31; + } + switch(inst) { + case 1: // EQUAL? + predicate(op0==op1 || (opc>2 && op0==op2) || (opc==4 && op0==op3)); + break; + case 2: // LESS? + predicate(op0op1); + break; + case 4: // DLESS? + xstore(op0,x=xfetch(op0)-1); + predicate(xop1); + break; + case 6: // IN? + predicate(mem[objects+op0*9+4]==op1); + break; + case 7: // BTST + predicate((op0&op1)==op1); + break; + case 8: // BOR + store(op0|op1); + break; + case 9: // BAND + store(op0&op1); + break; + case 10: // FSET? + flagset(); + predicate(opc&op3); + break; + case 11: // FSET + flagset(); + this.put(op2,opc|op3); + break; + case 12: // FCLEAR + flagset(); + this.put(op2,opc&~op3); + break; + case 13: // SET + xstore(op0,op1); + break; + case 14: // MOVE + move(op0,op1); + break; + case 15: // GET + store(this.get((op0+op1*2)&65535)); + break; + case 16: // GETB + store(mem[(op0+op1)&65535]); + break; + case 17: // GETP + if(propfind()) store(mem[op3-1]&32?this.get(op3):mem[op3]); + else store(this.get(defprop+2*op1)); + break; + case 18: // GETPT + propfind(); + store(op3); + break; + case 19: // NEXTP + if(op1) { + // Return next property + propfind(); + store(mem[op3+(mem[op3-1]>>5)+1]&31); + } else { + // Return first property + x=this.getu(objects+op0*9+7); + store(mem[x+mem[x]*2+1]&31); + } + break; + case 20: // ADD + store(op0+op1); + break; + case 21: // SUB + store(op0-op1); + break; + case 22: // MUL + store(Math.imul(op0,op1)); + break; + case 23: // DIV + store(Math.trunc(op0/op1)); + break; + case 24: // MOD + store(op0%op1); + break; + case 128: // ZERO? + predicate(!op0); + break; + case 129: // NEXT? + store(x=mem[objects+op0*9+5]); + predicate(x); + break; + case 130: // FIRST? + store(x=mem[objects+op0*9+6]); + predicate(x); + break; + case 131: // LOC + store(mem[objects+op0*9+4]); + break; + case 132: // PTSIZE + store((mem[(op0-1)&65535]>>5)+1); + break; + case 133: // INC + x=xfetch(op0); + xstore(op0,x+1); + break; + case 134: // DEC + x=xfetch(op0); + xstore(op0,x-1); + break; + case 135: // PRINTB + yield*this.genPrint(this.getText(op0&65535)); + break; + case 137: // REMOVE + move(op0,0); + break; + case 138: // PRINTD + yield*this.genPrint(this.getText(this.getu(objects+op0*9+7)+1)); + break; + case 139: // RETURN + ret(op0); + break; + case 140: // JUMP + pc+=op0-2; + break; + case 141: // PRINT + yield*this.genPrint(this.getText(addr(op0))); + break; + case 142: // VALUE + store(xfetch(op0)); + break; + case 143: // BCOM + store(~op0); + break; + case 176: // RTRUE + ret(1); + break; + case 177: // RFALSE + ret(0); + break; + case 178: // PRINTI + yield*this.genPrint(this.getText(pc)); + pc=this.endText; + break; + case 179: // PRINTR + yield*this.genPrint(this.getText(pc)+"\n"); + ret(1); + break; + case 180: // NOOP + break; + case 181: // SAVE + this.savedFlags=this.get(16); + predicate(yield*this.save(this.serialize(ds,cs,pc))); + break; + case 182: // RESTORE + this.savedFlags=this.get(16); + if(z=yield*this.restore()) z=this.deserialize(z); + this.put(16,this.savedFlags); + if(z) ds=z[0],cs=z[1],pc=z[2]; + predicate(z); + break; + case 183: // RESTART + init(); + yield*this.restarted(); + break; + case 184: // RSTACK + ret(ds[ds.length-1]); + break; + case 185: // FSTACK + ds.pop(); + break; + case 186: // QUIT + return; + case 187: // CRLF + yield*this.genPrint("\n"); + break; + case 188: // USL + if(this.updateStatusLine) yield*this.updateStatusLine(this.getText(this.getu(objects+xfetch(16)*9+7)+1),xfetch(18),xfetch(17)); + break; + case 189: // VERIFY + predicate(this.verify()); + break; + case 224: // CALL + if(op0) { + x=mem[op0=addr(op0)]; + cs.unshift({ds:ds,pc:pc,local:new Int16Array(x)}); + ds=[]; + pc=op0+1; + for(x=0;x1 && mem[op0]>0) cs[0].local[0]=op1; + if(opc>2 && mem[op0]>1) cs[0].local[1]=op2; + if(opc>3 && mem[op0]>2) cs[0].local[2]=op3; + } else { + store(0); + } + break; + case 225: // PUT + this.put((op0+op1*2)&65535,op2); + break; + case 226: // PUTB + mem[(op0+op1)&65535]=op2; + break; + case 227: // PUTP + propfind(); + if(mem[op3-1]&32) this.put(op3,op2); + else mem[op3]=op2; + break; + case 228: // READ + yield*this.genPrint(""); + if(this.updateStatusLine) yield*this.updateStatusLine(this.getText(this.getu(objects+xfetch(16)*9+7)+1),xfetch(18),xfetch(17)); + this.handleInput(yield*this.read(mem[op0&65535]),op0&65535,op1&65535); + break; + case 229: // PRINTC + yield*this.genPrint(op0==13?"\n":op0?String.fromCharCode(op0):""); + break; + case 230: // PRINTN + yield*this.genPrint(String(op0)); + break; + case 231: // RANDOM + if (op0 <= 0) { // If 'op0' is non-positive, reseed the PRNG. + if (op0 === 0) { + initRng(); // If 0, seed using Math.random(). + } else { + this.seed = (op0 >>> 0); // If negative, seed with the specified value. + } + store(0); // Reseeding always returns 0. + break; + } + this.seed = (1664525 * this.seed + 1013904223) >>> 0; // Linear congruential generator + store(Math.floor((this.seed / 0xFFFFFFFF) * op0) + 1); // Return integer in range [1..op0] (inclusive). + break; + case 232: // PUSH + ds.push(op0); + break; + case 233: // POP + xstore(op0,ds.pop()); + break; + case 234: // SPLIT + if(this.split) yield*this.split(op0); + break; + case 235: // SCREEN + if(this.screen) yield*this.screen(op0); + break; + default: + throw new Error("JSZM: Invalid Z-machine opcode"); + } + } + + }, + save: ()=>[], + savedFlags: 0, + selfInsertingBreaks: null, + serial: null, + serialize: function(ds,cs,pc) { + var i,j,e,ar,vi; + e=this.getu(14); // PURBOT + i=e+cs.reduce((p,c)=>p+2*(c.ds.length+c.local.length)+6,0)+2*ds.length+8; + ar=new Uint8Array(i); + ar.set(new Uint8Array(this.mem.buffer,0,e)); + vi=new DataView(ar.buffer); + vi.setUint32(e,pc); + vi.setUint16(e+4,cs.length); + vi.setUint16(e+6,ds.length); + for(i=0;i) => void = () => { }; + terminalLine: string = ""; + terminal: Terminal; fitAddon: FitAddon; serializeAddon: SerializeAddon; @@ -35,25 +41,61 @@ export class DebugWidget implements FarpatchWidget { onInit(): void { console.log("Initialized Debug Widget"); } + + readLine(): Promise { + return new Promise((resolve, reject) => { }); + } + onFocus(element: HTMLElement): void { console.log("Displaying Debug Widget"); if (!this.initialized) { // Ensure the parent frame doesn't get any scrollbars, since we're taking up the whole view element.style.overflow = "hidden"; console.log("Initializing xterm.js"); - // var terminalContainer = document.createElement("div"); - // this.view.appendChild(terminalContainer); this.terminal.loadAddon(this.fitAddon); this.terminal.loadAddon(this.serializeAddon); this.terminal.onKey((e) => { - console.log("Key pressed: " + e.key); this.terminal.write(e.key); + if (e.key === '\h') { + if (this.terminalLine.length > 0) { + this.terminalLine = this.terminalLine.substring(0, this.terminalLine.length - 1); + } + } if (e.key === '\r') { this.terminal.write('\n'); + var zcb = this.zorkCallback; + var tl = this.terminalLine; + this.zorkCallback = () => { }; + this.terminalLine = ""; + zcb(tl); + } + else { + this.terminalLine += e.key; } }); this.terminal.open(this.view); - this.terminal.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n'); + + var zorkTerminal = this.terminal; + var debugWidget = this; + fetch("/zork1.z3").then((response) => { + response.arrayBuffer().then((buffer) => { + this.zork = co.co(function* () { + var zork = new JSZM(new Uint8Array(buffer)); + zork.print = function* (str: string) { + str = str.replace("\n", "\r\n"); + zorkTerminal.write(str); + }; + zork.read = function* (maxlen: number): Generator { + // console.log("Zork: read " + maxlen); + var val = yield new Promise((resolve, reject) => { + debugWidget.zorkCallback = resolve; + }); + return val; + }; + yield* zork.run(); + }); + }) + }); this.initialized = true; } element.appendChild(this.view); diff --git a/static/zork1.z3 b/static/zork1.z3 new file mode 100644 index 0000000000000000000000000000000000000000..e447402828441d44375b2b067befcd0ef02b37b7 GIT binary patch literal 86838 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