UNPKG

zx-generation

Version:

A high-fidelity ZX Spectrum emulator in JavaScript — fully generated by a large language model (LLM) to explore the boundaries of AI in systems programming.

6 lines 123 kB
/** * ZXGeneration - ZX Spectrum Emulator * @version 1.0.1 * @license MIT */ !function(t,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((t="undefined"!=typeof globalThis?globalThis:t||self).ZXGeneration={})}(this,(function(t){"use strict";class s{constructor(){this.reset()}reset(){this.data={A:0,F:0,B:0,C:0,D:0,E:0,H:0,L:0,A_:0,F_:0,B_:0,C_:0,D_:0,E_:0,H_:0,L_:0,I:0,R:0,IX:0,IY:0,SP:65535,PC:0}}get(t){return 255&this.data[t]}set(t,s){this.data[t]=255&s}getBC(){return this.data.B<<8|this.data.C}getDE(){return this.data.D<<8|this.data.E}getHL(){return this.data.H<<8|this.data.L}getAF(){return this.data.A<<8|this.data.F}setBC(t){const s=65535&t;this.data.B=s>>8&255,this.data.C=255&s}setDE(t){const s=65535&t;this.data.D=s>>8&255,this.data.E=255&s}setHL(t){const s=65535&t;this.data.H=s>>8&255,this.data.L=255&s}setAF(t){const s=65535&t;this.data.A=s>>8&255,this.data.F=255&s}get16(t){switch(t){case"BC":return this.getBC();case"DE":return this.getDE();case"HL":return this.getHL();case"AF":return this.getAF();case"SP":return 65535&this.data.SP;case"PC":return 65535&this.data.PC;case"IX":return 65535&this.data.IX;case"IY":return 65535&this.data.IY;default:throw new Error(`Unknown 16-bit register: ${t}`)}}set16(t,s){const e=65535&s;switch(t){case"BC":this.setBC(e);break;case"DE":this.setDE(e);break;case"HL":this.setHL(e);break;case"AF":this.setAF(e);break;case"SP":this.data.SP=e;break;case"PC":this.data.PC=e;break;case"IX":this.data.IX=e;break;case"IY":this.data.IY=e;break;default:throw new Error(`Unknown 16-bit register: ${t}`)}}inc16(t){const s=this.get16(t);this.set16(t,s+1&65535)}dec16(t){const s=this.get16(t);this.set16(t,s-1&65535)}incrementPC(t=1){this.data.PC=this.data.PC+t&65535}setPC(t){this.data.PC=65535&t}getPC(){return 65535&this.data.PC}incrementR(){this.data.R=this.data.R+1&127|128&this.data.R}exchangeAF(){const t=this.data.A,s=this.data.F;this.data.A=this.data.A_,this.data.F=this.data.F_,this.data.A_=t,this.data.F_=s}exchangeAll(){const t=this.data.B,s=this.data.C,e=this.data.D,i=this.data.E,r=this.data.H,a=this.data.L;this.data.B=this.data.B_,this.data.C=this.data.C_,this.data.D=this.data.D_,this.data.E=this.data.E_,this.data.H=this.data.H_,this.data.L=this.data.L_,this.data.B_=t,this.data.C_=s,this.data.D_=e,this.data.E_=i,this.data.H_=r,this.data.L_=a}exchangeDE_HL(){const t=this.getDE();this.setDE(this.getHL()),this.setHL(t)}dump(){return{A:this.data.A.toString(16).padStart(2,"0"),F:this.data.F.toString(16).padStart(2,"0"),BC:this.getBC().toString(16).padStart(4,"0"),DE:this.getDE().toString(16).padStart(4,"0"),HL:this.getHL().toString(16).padStart(4,"0"),SP:this.data.SP.toString(16).padStart(4,"0"),PC:this.data.PC.toString(16).padStart(4,"0"),IX:this.data.IX.toString(16).padStart(4,"0"),IY:this.data.IY.toString(16).padStart(4,"0"),I:this.data.I.toString(16).padStart(2,"0"),R:this.data.R.toString(16).padStart(2,"0")}}getIXH(){return this.data.IX>>8&255}setIXH(t){this.data.IX=255&this.data.IX|(255&t)<<8}getIXL(){return 255&this.data.IX}setIXL(t){this.data.IX=65280&this.data.IX|255&t}getIYH(){return this.data.IY>>8&255}setIYH(t){this.data.IY=255&this.data.IY|(255&t)<<8}getIYL(){return 255&this.data.IY}setIYL(t){this.data.IY=65280&this.data.IY|255&t}get a(){return this.get("A")}set a(t){this.set("A",t)}get f(){return this.get("F")}set f(t){this.set("F",t)}get b(){return this.get("B")}set b(t){this.set("B",t)}get c(){return this.get("C")}set c(t){this.set("C",t)}get d(){return this.get("D")}set d(t){this.set("D",t)}get e(){return this.get("E")}set e(t){this.set("E",t)}get h(){return this.get("H")}set h(t){this.set("H",t)}get l(){return this.get("L")}set l(t){this.set("L",t)}get i(){return this.get("I")}set i(t){this.set("I",t)}get r(){return this.get("R")}set r(t){this.set("R",t)}get pc(){return this.getPC()}set pc(t){this.setPC(t)}get sp(){return 65535&this.data.SP}set sp(t){this.data.SP=65535&t}get ix(){return 65535&this.data.IX}set ix(t){this.data.IX=65535&t}get iy(){return 65535&this.data.IY}set iy(t){this.data.IY=65535&t}get bc(){return this.getBC()}set bc(t){this.setBC(t)}get de(){return this.getDE()}set de(t){this.setDE(t)}get hl(){return this.getHL()}set hl(t){this.setHL(t)}get af(){return this.getAF()}set af(t){this.setAF(t)}}class e{constructor(){this.masks={S:128,Z:64,F5:32,H:16,F3:8,PV:4,N:2,C:1}}getFlag(t,s){return 0!==(t&s)}setFlag(t,s,e){return e?t|s:t&~s}updateFlags(t,s,e="arithmetic"){const i=255&s;let r=t;return r=this.setFlag(r,this.masks.F5,!!(32&i)),r=this.setFlag(r,this.masks.F3,!!(8&i)),r=this.setFlag(r,this.masks.S,!!(128&i)),r=this.setFlag(r,this.masks.Z,0===i),"subtract"===e?r=this.setFlag(r,this.masks.N,!0):"arithmetic"===e?r=this.setFlag(r,this.masks.N,!1):"logical"===e&&(r=this.setFlag(r,this.masks.N,!1),r=this.setFlag(r,this.masks.PV,this.calculateParity(i))),r}calculateParity(t){let s=0,e=255&t;for(let t=0;t<8;t++)1&e&&s++,e>>=1;return!(1&s)}updateInFlags(t,s){let e=t;return e=this.setFlag(e,this.masks.S,!!(128&s)),e=this.setFlag(e,this.masks.Z,0===s),e=this.setFlag(e,this.masks.H,!1),e=this.setFlag(e,this.masks.N,!1),e=this.setFlag(e,this.masks.PV,this.calculateParity(s)),e=this.setFlag(e,this.masks.F5,!!(32&s)),e=this.setFlag(e,this.masks.F3,!!(8&s)),e}updateIncFlags(t,s,e){let i=t;return i=this.setFlag(i,this.masks.S,!!(128&e)),i=this.setFlag(i,this.masks.Z,0===e),i=this.setFlag(i,this.masks.H,!(15&~s)),i=this.setFlag(i,this.masks.PV,127===s),i=this.setFlag(i,this.masks.N,!1),i=this.setFlag(i,this.masks.F5,!!(32&e)),i=this.setFlag(i,this.masks.F3,!!(8&e)),i}updateDecFlags(t,s,e){let i=t;return i=this.setFlag(i,this.masks.S,!!(128&e)),i=this.setFlag(i,this.masks.Z,0===e),i=this.setFlag(i,this.masks.H,!(15&s)),i=this.setFlag(i,this.masks.PV,128===s),i=this.setFlag(i,this.masks.N,!0),i=this.setFlag(i,this.masks.F5,!!(32&e)),i=this.setFlag(i,this.masks.F3,!!(8&e)),i}updateBitTestFlags(t,s,e){const i=e&1<<s;let r=t;return r=this.setFlag(r,this.masks.Z,0===i),r=this.setFlag(r,this.masks.H,!0),r=this.setFlag(r,this.masks.N,!1),r=this.setFlag(r,this.masks.S,7===s&&0!==i),r=this.setFlag(r,this.masks.PV,0===i),r=this.setFlag(r,this.masks.F5,!!(32&e)),r=this.setFlag(r,this.masks.F3,!!(8&e)),r}}class i{constructor(t){this.memory=t}readByte(t){return this.memory.read(65535&t)}writeByte(t,s){this.memory.write(65535&t,255&s)}readWord(t){const s=65535&t;return this.memory.read(s)|this.memory.read(s+1&65535)<<8}writeWord(t,s){const e=65535&t,i=65535&s;this.memory.write(e,255&i),this.memory.write(e+1&65535,i>>8&255)}fetchByte(t){const s=this.readByte(t.getPC());return t.incrementPC(),s}fetchWord(t){return this.fetchByte(t)|this.fetchByte(t)<<8}pushByte(t,s){const e=t.get16("SP")-1&65535;t.set16("SP",e),this.writeByte(e,s)}popByte(t){const s=t.get16("SP"),e=this.readByte(s);return t.set16("SP",s+1&65535),e}pushWord(t,s){this.pushByte(t,s>>8&255),this.pushByte(t,255&s)}popWord(t){return this.popByte(t)|this.popByte(t)<<8}}class r{constructor(t){this.ula=t}readPort(t){return this.ula.readPort(65535&t)}writePort(t,s){this.ula.writePort(65535&t,255&s)}}class a{constructor(t,s,e){this.registers=t,this.flags=s,this.memory=e}addA(t,s=4){const e=this.registers.get("A"),i=e+t,r=(15&e)+(15&t)>15,a=i>255;let h=this.registers.get("F");h=this.flags.setFlag(h,this.flags.masks.C,a),h=this.flags.setFlag(h,this.flags.masks.H,r),h=this.flags.setFlag(h,this.flags.masks.N,!1);const n=!(128&(e^t)||!(128&(e^i)));return h=this.flags.updateFlags(h,255&i),h=this.flags.setFlag(h,this.flags.masks.PV,n),this.registers.set("A",255&i),this.registers.set("F",h),s}subA(t,s=4){const e=this.registers.get("A"),i=e-t,r=(15&e)-(15&t)<0,a=i<0;let h=this.registers.get("F");h=this.flags.setFlag(h,this.flags.masks.C,a),h=this.flags.setFlag(h,this.flags.masks.H,r),h=this.flags.setFlag(h,this.flags.masks.N,!0);const n=!!(128&(e^t))&&!!(128&(e^i));return h=this.flags.updateFlags(h,255&i,"subtract"),h=this.flags.setFlag(h,this.flags.masks.PV,n),this.registers.set("A",255&i),this.registers.set("F",h),s}adcA(t,s=4){const e=this.registers.get("A"),i=this.flags.getFlag(this.registers.get("F"),this.flags.masks.C)?1:0,r=e+t+i,a=(15&e)+(15&t)+i>15,h=r>255;let n=this.registers.get("F");n=this.flags.setFlag(n,this.flags.masks.C,h),n=this.flags.setFlag(n,this.flags.masks.H,a),n=this.flags.setFlag(n,this.flags.masks.N,!1);const o=!(128&(e^t)||!(128&(e^r)));return n=this.flags.updateFlags(n,255&r),n=this.flags.setFlag(n,this.flags.masks.PV,o),this.registers.set("A",255&r),this.registers.set("F",n),s}sbcA(t,s=4){const e=this.registers.get("A"),i=this.flags.getFlag(this.registers.get("F"),this.flags.masks.C)?1:0,r=e-t-i,a=(15&e)-(15&t)-i<0,h=r<0;let n=this.registers.get("F");n=this.flags.setFlag(n,this.flags.masks.C,h),n=this.flags.setFlag(n,this.flags.masks.H,a),n=this.flags.setFlag(n,this.flags.masks.N,!0);const o=!!(128&(e^t))&&!!(128&(e^r));return n=this.flags.updateFlags(n,255&r,"subtract"),n=this.flags.setFlag(n,this.flags.masks.PV,o),this.registers.set("A",255&r),this.registers.set("F",n),s}cpA(t,s=4){const e=this.registers.get("A"),i=e-t,r=(15&e)-(15&t)<0,a=i<0,h=255&i;let n=this.registers.get("F");n=this.flags.setFlag(n,this.flags.masks.C,a),n=this.flags.setFlag(n,this.flags.masks.H,r),n=this.flags.setFlag(n,this.flags.masks.N,!0),n=this.flags.setFlag(n,this.flags.masks.S,!!(128&h)),n=this.flags.setFlag(n,this.flags.masks.Z,0===h);const o=!!(128&(e^t))&&!!(128&(e^h));return n=this.flags.setFlag(n,this.flags.masks.PV,o),n=this.flags.setFlag(n,this.flags.masks.F5,!!(32&t)),n=this.flags.setFlag(n,this.flags.masks.F3,!!(8&t)),this.registers.set("F",n),s}incReg(t,s=4){const e=this.registers.get(t),i=e+1&255;this.registers.set(t,i);const r=this.flags.updateIncFlags(this.registers.get("F"),e,i);return this.registers.set("F",r),s}decReg(t,s=4){const e=this.registers.get(t),i=e-1&255;this.registers.set(t,i);const r=this.flags.updateDecFlags(this.registers.get("F"),e,i);return this.registers.set("F",r),s}incHL(t=11){const s=this.registers.getHL(),e=this.memory.readByte(s),i=e+1&255;this.memory.writeByte(s,i);const r=this.flags.updateIncFlags(this.registers.get("F"),e,i);return this.registers.set("F",r),t}decHL(t=11){const s=this.registers.getHL(),e=this.memory.readByte(s),i=e-1&255;this.memory.writeByte(s,i);const r=this.flags.updateDecFlags(this.registers.get("F"),e,i);return this.registers.set("F",r),t}addHL(t,s=11){const e=this.registers.getHL(),i=e+t;let r=this.registers.get("F");r=this.flags.setFlag(r,this.flags.masks.C,i>65535),r=this.flags.setFlag(r,this.flags.masks.H,(4095&e)+(4095&t)>4095),r=this.flags.setFlag(r,this.flags.masks.N,!1),this.registers.setHL(65535&i);const a=i>>8&255;return r=this.flags.setFlag(r,this.flags.masks.F5,!!(32&a)),r=this.flags.setFlag(r,this.flags.masks.F3,!!(8&a)),this.registers.set("F",r),s}neg(t=8){const s=this.registers.get("A"),e=255&-s;let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,0!==s),i=this.flags.setFlag(i,this.flags.masks.H,!!(15&s)),i=this.flags.setFlag(i,this.flags.masks.PV,128===s),i=this.flags.setFlag(i,this.flags.masks.N,!0),i=this.flags.setFlag(i,this.flags.masks.S,!!(128&e)),i=this.flags.setFlag(i,this.flags.masks.Z,0===e),i=this.flags.setFlag(i,this.flags.masks.F5,!!(32&e)),i=this.flags.setFlag(i,this.flags.masks.F3,!!(8&e)),this.registers.set("A",e),this.registers.set("F",i),t}}class h{constructor(t,s){this.registers=t,this.flags=s}andA(t){const s=this.registers.get("A")&t;this.registers.set("A",s);let e=this.registers.get("F");return e=this.flags.setFlag(e,this.flags.masks.C,!1),e=this.flags.setFlag(e,this.flags.masks.H,!0),e=this.flags.updateFlags(e,s,"logical"),this.registers.set("F",e),4}orA(t){const s=this.registers.get("A")|t;this.registers.set("A",s);let e=this.registers.get("F");return e=this.flags.setFlag(e,this.flags.masks.C,!1),e=this.flags.setFlag(e,this.flags.masks.H,!1),e=this.flags.updateFlags(e,s,"logical"),this.registers.set("F",e),4}xorA(t){const s=this.registers.get("A")^t;this.registers.set("A",s);let e=this.registers.get("F");return e=this.flags.setFlag(e,this.flags.masks.C,!1),e=this.flags.setFlag(e,this.flags.masks.H,!1),e=this.flags.updateFlags(e,s,"logical"),this.registers.set("F",e),4}cpl(){this.registers.set("A",255&~this.registers.get("A"));let t=this.registers.get("F");t=this.flags.setFlag(t,this.flags.masks.H,!0),t=this.flags.setFlag(t,this.flags.masks.N,!0);const s=this.registers.get("A");return t=this.flags.setFlag(t,this.flags.masks.F5,!!(32&s)),t=this.flags.setFlag(t,this.flags.masks.F3,!!(8&s)),this.registers.set("F",t),4}scf(){let t=this.registers.get("F");t=this.flags.setFlag(t,this.flags.masks.C,!0),t=this.flags.setFlag(t,this.flags.masks.H,!1),t=this.flags.setFlag(t,this.flags.masks.N,!1);const s=this.registers.get("A");return t=this.flags.setFlag(t,this.flags.masks.F5,!!(32&s)),t=this.flags.setFlag(t,this.flags.masks.F3,!!(8&s)),this.registers.set("F",t),4}ccf(){const t=this.flags.getFlag(this.registers.get("F"),this.flags.masks.C);let s=this.registers.get("F");s=this.flags.setFlag(s,this.flags.masks.H,t),s=this.flags.setFlag(s,this.flags.masks.C,!t),s=this.flags.setFlag(s,this.flags.masks.N,!1);const e=this.registers.get("A");return s=this.flags.setFlag(s,this.flags.masks.F5,!!(32&e)),s=this.flags.setFlag(s,this.flags.masks.F3,!!(8&e)),this.registers.set("F",s),4}daa(){let t=this.registers.get("A"),s=this.registers.get("F");const e=this.flags.getFlag(s,this.flags.masks.C),i=this.flags.getFlag(s,this.flags.masks.H);let r=0,a=!1;if(this.flags.getFlag(s,this.flags.masks.N)){i&&(r|=6),e&&(r|=96);const h=t-r&255,n=(15&t)<(15&r);s=this.flags.setFlag(s,this.flags.masks.H,n),t=h,a=e}else{(i||(15&t)>9)&&(r|=6),(e||t>153)&&(r|=96,a=!0);const h=t+r&255,n=(15&t)+(15&r)>15;s=this.flags.setFlag(s,this.flags.masks.H,n),t=h}return s=this.flags.setFlag(s,this.flags.masks.S,!!(128&t)),s=this.flags.setFlag(s,this.flags.masks.Z,0===t),s=this.flags.setFlag(s,this.flags.masks.PV,this.flags.calculateParity(t)),s=this.flags.setFlag(s,this.flags.masks.C,a),s=this.flags.setFlag(s,this.flags.masks.F5,!!(32&t)),s=this.flags.setFlag(s,this.flags.masks.F3,!!(8&t)),this.registers.set("A",t),this.registers.set("F",s),4}}function n(t){return 128&t?t-256:t}class o{constructor(t,s,e,i,r=null){this.registers=t,this.memory=s,this.io=e,this.flags=i,this.cpu=r}loadRegImmediate(t,s){return this.registers.set(t,255&s),7}loadReg16Immediate(t,s){return this.registers.set16(t,65535&s),"IX"===t||"IY"===t?14:10}loadRegReg(t,s){return this.registers.set(t,this.registers.get(s)),4}loadRegFromHL(t){const s=this.registers.getHL();return this.registers.set(t,this.memory.readByte(s)),7}loadHLFromReg(t){const s=this.registers.getHL();return this.memory.writeByte(s,this.registers.get(t)),7}loadHLImmediate(t){const s=this.registers.getHL();return this.memory.writeByte(s,255&t),10}loadAFromBC(){const t=this.registers.getBC();return this.registers.set("A",this.memory.readByte(t)),7}loadAFromDE(){const t=this.registers.getDE();return this.registers.set("A",this.memory.readByte(t)),7}loadBCFromA(){const t=this.registers.getBC();return this.memory.writeByte(t,this.registers.get("A")),7}loadDEFromA(){const t=this.registers.getDE();return this.memory.writeByte(t,this.registers.get("A")),7}loadAFromAddress(t){return this.registers.set("A",this.memory.readByte(65535&t)),13}loadAddressFromA(t){return this.memory.writeByte(65535&t,this.registers.get("A")),13}loadHLFromAddress(t){return this.registers.setHL(this.memory.readWord(65535&t)),16}loadAddressFromHL(t){return this.memory.writeWord(65535&t,this.registers.getHL()),16}loadReg16FromAddress(t,s){return this.registers.set16(t,this.memory.readWord(65535&s)),20}loadAddressFromReg16(t,s){return this.memory.writeWord(65535&t,this.registers.get16(s)),20}loadSPFromHL(){return this.registers.set16("SP",this.registers.getHL()),6}loadIFromA(){return this.registers.set("I",this.registers.get("A")),9}loadRFromA(){return this.registers.set("R",this.registers.get("A")),9}_updateFlagsAfterLoadAIorAR(t){let s=this.registers.get("F");const e=this.flags.getFlag(s,this.flags.masks.C);s=this.flags.setFlag(s,this.flags.masks.S,!!(128&t)),s=this.flags.setFlag(s,this.flags.masks.Z,0===t),s=this.flags.setFlag(s,this.flags.masks.H,!1),s=this.flags.setFlag(s,this.flags.masks.N,!1),this.cpu&&(s=this.flags.setFlag(s,this.flags.masks.PV,!!this.cpu.iff2)),s=this.flags.setFlag(s,this.flags.masks.F5,!!(32&t)),s=this.flags.setFlag(s,this.flags.masks.F3,!!(8&t)),s=this.flags.setFlag(s,this.flags.masks.C,e),this.registers.set("F",s)}loadAFromI(){const t=255&this.registers.get("I");return this.registers.set("A",t),this._updateFlagsAfterLoadAIorAR(t),9}loadAFromR(){const t=255&this.registers.get("R");return this.registers.set("A",t),this._updateFlagsAfterLoadAIorAR(t),9}loadRegFromIndexed(t,s,e){const i=n(e),r=this.registers.get16(s)+i&65535;return this.registers.set(t,this.memory.readByte(r)),19}loadIndexedFromReg(t,s,e){const i=n(s),r=this.registers.get16(t)+i&65535;return this.memory.writeByte(r,this.registers.get(e)),19}loadIndexedImmediate(t,s,e){const i=n(s),r=this.registers.get16(t)+i&65535;return this.memory.writeByte(r,255&e),19}}class l{constructor(t,s,e){this.registers=t,this.flags=s,this.memory=e}jump(t){return this.registers.setPC(t),10}jumpConditional(t,s){return this.checkCondition(t)&&this.registers.setPC(s),10}jumpHL(){return this.registers.setPC(this.registers.getHL()),4}jumpIndexed(t){return this.registers.setPC(this.registers.get16(t)),8}jumpRelative(t){const s=t>127?t-256:t,e=this.registers.getPC()+s&65535;return this.registers.setPC(e),12}jumpRelativeConditional(t,s){if(this.checkCondition(t)){const t=s>127?s-256:s,e=this.registers.getPC()+t&65535;return this.registers.setPC(e),12}return 7}call(t){return this.memory.pushWord(this.registers,this.registers.getPC()),this.registers.setPC(t),17}callConditional(t,s){return this.checkCondition(t)?(this.memory.pushWord(this.registers,this.registers.getPC()),this.registers.setPC(s),17):10}ret(){const t=this.memory.popWord(this.registers);return this.registers.setPC(t),10}retConditional(t){if(this.checkCondition(t)){const t=this.memory.popWord(this.registers);return this.registers.setPC(t),11}return 5}reti(){const t=this.memory.popWord(this.registers);return this.registers.setPC(t),14}retn(t){const s=this.memory.popWord(this.registers);return this.registers.setPC(s),t&&(t.iff1=t.iff2),14}rst(t){return this.memory.pushWord(this.registers,this.registers.getPC()),this.registers.setPC(t),11}djnz(t){const s=this.registers.get("B")-1&255;if(this.registers.set("B",s),0!==s){const s=t>127?t-256:t,e=this.registers.getPC()+s&65535;return this.registers.setPC(e),13}return 8}checkCondition(t){const s=this.registers.get("F");switch(t){case"NZ":return!this.flags.getFlag(s,this.flags.masks.Z);case"Z":return this.flags.getFlag(s,this.flags.masks.Z);case"NC":return!this.flags.getFlag(s,this.flags.masks.C);case"C":return this.flags.getFlag(s,this.flags.masks.C);case"PO":return!this.flags.getFlag(s,this.flags.masks.PV);case"PE":return this.flags.getFlag(s,this.flags.masks.PV);case"P":return!this.flags.getFlag(s,this.flags.masks.S);case"M":return this.flags.getFlag(s,this.flags.masks.S);default:return!1}}}class g{constructor(t,s,e){this.registers=t,this.flags=s,this.memory=e}bitTest(t,s,e=!1){const i=this.flags.updateBitTestFlags(this.registers.get("F"),t,s);return this.registers.set("F",i),e?8:4}setBitReg(t,s){const e=this.registers.get(s);return this.registers.set(s,e|1<<t),8}resBitReg(t,s){const e=this.registers.get(s);return this.registers.set(s,e&~(1<<t)),8}setBitHL(t){const s=this.registers.getHL(),e=this.memory.readByte(s);return this.memory.writeByte(s,e|1<<t),15}resBitHL(t){const s=this.registers.getHL(),e=this.memory.readByte(s);return this.memory.writeByte(s,e&~(1<<t)),15}rlc(t){const s=!!(128&t),e=255&(t<<1|(s?1:0));let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.updateFlags(i,e,"logical"),this.registers.set("F",i),e}rrc(t){const s=!!(1&t),e=255&(t>>1|(s?128:0));let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.updateFlags(i,e,"logical"),this.registers.set("F",i),e}rl(t){const s=!!(128&t),e=255&(t<<1|(this.flags.getFlag(this.registers.get("F"),this.flags.masks.C)?1:0));let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.updateFlags(i,e,"logical"),this.registers.set("F",i),e}rr(t){const s=!!(1&t),e=255&(t>>1|(this.flags.getFlag(this.registers.get("F"),this.flags.masks.C)?128:0));let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.updateFlags(i,e,"logical"),this.registers.set("F",i),e}sla(t){const s=!!(128&t),e=t<<1&255;let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.updateFlags(i,e,"logical"),this.registers.set("F",i),e}sra(t){const s=!!(1&t),e=255&(t>>1|128&t);let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.updateFlags(i,e,"logical"),this.registers.set("F",i),e}sll(t){const s=!!(128&t),e=t<<1&255|1;let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.updateFlags(i,e,"logical"),this.registers.set("F",i),e}srl(t){const s=!!(1&t),e=t>>1&255;let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.updateFlags(i,e,"logical"),this.registers.set("F",i),e}rlca(){const t=this.registers.get("A"),s=!!(128&t),e=255&(t<<1|(s?1:0));this.registers.set("A",e);let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.setFlag(i,this.flags.masks.F5,!!(32&e)),i=this.flags.setFlag(i,this.flags.masks.F3,!!(8&e)),this.registers.set("F",i),4}rrca(){const t=this.registers.get("A"),s=!!(1&t),e=255&(t>>1|(s?128:0));this.registers.set("A",e);let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.setFlag(i,this.flags.masks.F5,!!(32&e)),i=this.flags.setFlag(i,this.flags.masks.F3,!!(8&e)),this.registers.set("F",i),4}rla(){const t=this.registers.get("A"),s=!!(128&t),e=255&(t<<1|(this.flags.getFlag(this.registers.get("F"),this.flags.masks.C)?1:0));this.registers.set("A",e);let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.setFlag(i,this.flags.masks.F5,!!(32&e)),i=this.flags.setFlag(i,this.flags.masks.F3,!!(8&e)),this.registers.set("F",i),4}rra(){const t=this.registers.get("A"),s=!!(1&t),e=255&(t>>1|(this.flags.getFlag(this.registers.get("F"),this.flags.masks.C)?128:0));this.registers.set("A",e);let i=this.registers.get("F");return i=this.flags.setFlag(i,this.flags.masks.C,s),i=this.flags.setFlag(i,this.flags.masks.H,!1),i=this.flags.setFlag(i,this.flags.masks.N,!1),i=this.flags.setFlag(i,this.flags.masks.F5,!!(32&e)),i=this.flags.setFlag(i,this.flags.masks.F3,!!(8&e)),this.registers.set("F",i),4}processRegister(t,s){const e=this.registers.get(s);let i;switch(t){case"RLC":i=this.rlc(e);break;case"RRC":i=this.rrc(e);break;case"RL":i=this.rl(e);break;case"RR":i=this.rr(e);break;case"SLA":i=this.sla(e);break;case"SRA":i=this.sra(e);break;case"SLL":i=this.sll(e);break;case"SRL":i=this.srl(e);break;default:return 0}return this.registers.set(s,i),8}processHL(t){const s=this.registers.getHL(),e=this.memory.readByte(s);let i;switch(t){case"RLC":i=this.rlc(e);break;case"RRC":i=this.rrc(e);break;case"RL":i=this.rl(e);break;case"RR":i=this.rr(e);break;case"SLA":i=this.sla(e);break;case"SRA":i=this.sra(e);break;case"SLL":i=this.sll(e);break;case"SRL":i=this.srl(e);break;default:return 0}return this.memory.writeByte(s,i),15}}class c{constructor(t,s){this.registers=t,this.memory=s}nop(){return 4}halt(t){return t&&(t.halted=!0),4}di(t){return t&&(t.iff1=!1,t.iff2=!1),4}ei(t){return t&&(t.iff1=!0,t.iff2=!0),4}exAF(){return this.registers.exchangeAF(),4}exx(){return this.registers.exchangeAll(),4}exDEHL(){return this.registers.exchangeDE_HL(),4}exSPHL(){const t=this.memory.readWord(this.registers.get16("SP"));return this.memory.writeWord(this.registers.get16("SP"),this.registers.getHL()),this.registers.setHL(t),19}exSPIX(){const t=this.memory.readWord(this.registers.get16("SP"));return this.memory.writeWord(this.registers.get16("SP"),this.registers.get16("IX")),this.registers.set16("IX",t),23}exSPIY(){const t=this.memory.readWord(this.registers.get16("SP"));return this.memory.writeWord(this.registers.get16("SP"),this.registers.get16("IY")),this.registers.set16("IY",t),23}push(t){const s=this.registers.get16(t);return this.memory.pushWord(this.registers,s),"IX"===t||"IY"===t?15:11}pop(t){const s=this.memory.popWord(this.registers);return this.registers.set16(t,s),"IX"===t||"IY"===t?14:10}inAImmediate(t,s){const e=t|this.registers.get("A")<<8;return this.registers.set("A",s.readPort(e)),11}outAImmediate(t,s){const e=this.registers.get("A"),i=t|e<<8;return s.writePort(i,e),11}inRegC(t,s,e){const i=this.registers.getBC(),r=s.readPort(i);null!==t&&this.registers.set(t,r);const a=e.updateInFlags(this.registers.get("F"),r);return this.registers.set("F",a),12}outRegC(t,s){const e=this.registers.getBC(),i=t?this.registers.get(t):0;return s.writePort(e,i),12}setInterruptMode(t,s){return s&&(s.interruptMode=t),8}}class d{constructor(t,s,e,i){this.registers=t,this.flags=s,this.memory=e,this.io=i}ldi(){const t=this.memory.readByte(this.registers.getHL());this.memory.writeByte(this.registers.getDE(),t),this.registers.setHL(this.registers.getHL()+1&65535),this.registers.setDE(this.registers.getDE()+1&65535),this.registers.setBC(this.registers.getBC()-1&65535);let s=this.registers.get("F");s=this.flags.setFlag(s,this.flags.masks.H,!1),s=this.flags.setFlag(s,this.flags.masks.N,!1),s=this.flags.setFlag(s,this.flags.masks.PV,0!==this.registers.getBC());const e=this.registers.get("A")+t&255;return s=this.flags.setFlag(s,this.flags.masks.F5,!!(32&e)),s=this.flags.setFlag(s,this.flags.masks.F3,!!(8&e)),this.registers.set("F",s),16}ldir(){const t=this.ldi();return 0!==this.registers.getBC()?(this.registers.setPC(this.registers.getPC()-2&65535),21):t}ldd(){const t=this.memory.readByte(this.registers.getHL());this.memory.writeByte(this.registers.getDE(),t),this.registers.setHL(this.registers.getHL()-1&65535),this.registers.setDE(this.registers.getDE()-1&65535),this.registers.setBC(this.registers.getBC()-1&65535);let s=this.registers.get("F");s=this.flags.setFlag(s,this.flags.masks.H,!1),s=this.flags.setFlag(s,this.flags.masks.N,!1),s=this.flags.setFlag(s,this.flags.masks.PV,0!==this.registers.getBC());const e=this.registers.get("A")+t&255;return s=this.flags.setFlag(s,this.flags.masks.F5,!!(32&e)),s=this.flags.setFlag(s,this.flags.masks.F3,!!(8&e)),this.registers.set("F",s),16}lddr(){const t=this.ldd();return 0!==this.registers.getBC()?(this.registers.setPC(this.registers.getPC()-2&65535),21):t}cpi(){const t=this.memory.readByte(this.registers.getHL()),s=this.registers.get("A"),e=s-t&65535,i=(15&s)-(15&t)<0;this.registers.setHL(this.registers.getHL()+1&65535),this.registers.setBC(this.registers.getBC()-1&65535);let r=this.registers.get("F");r=this.flags.setFlag(r,this.flags.masks.S,!!(128&e)),r=this.flags.setFlag(r,this.flags.masks.Z,!(255&e)),r=this.flags.setFlag(r,this.flags.masks.H,i),r=this.flags.setFlag(r,this.flags.masks.PV,0!==this.registers.getBC()),r=this.flags.setFlag(r,this.flags.masks.N,!0);const a=(255&e)-(i?1:0)&255;return r=this.flags.setFlag(r,this.flags.masks.F3,!!(8&a)),r=this.flags.setFlag(r,this.flags.masks.F5,!!(32&a)),this.registers.set("F",r),16}cpir(){const t=this.cpi(),s=!this.flags.getFlag(this.registers.get("F"),this.flags.masks.Z);if(0!==this.registers.getBC()&&s){this.registers.setPC(this.registers.getPC()-2&65535);let t=this.registers.get("F");return t=this.flags.setFlag(t,this.flags.masks.PV,!0),this.registers.set("F",t),21}if(!s){let t=this.registers.get("F");t=this.flags.setFlag(t,this.flags.masks.PV,!1),this.registers.set("F",t)}return t}cpd(){const t=this.memory.readByte(this.registers.getHL()),s=this.registers.get("A"),e=s-t&65535,i=(15&s)-(15&t)<0;this.registers.setHL(this.registers.getHL()-1&65535),this.registers.setBC(this.registers.getBC()-1&65535);let r=this.registers.get("F");r=this.flags.setFlag(r,this.flags.masks.S,!!(128&e)),r=this.flags.setFlag(r,this.flags.masks.Z,!(255&e)),r=this.flags.setFlag(r,this.flags.masks.H,i),r=this.flags.setFlag(r,this.flags.masks.PV,0!==this.registers.getBC()),r=this.flags.setFlag(r,this.flags.masks.N,!0);const a=(255&e)-(i?1:0)&255;return r=this.flags.setFlag(r,this.flags.masks.F3,!!(8&a)),r=this.flags.setFlag(r,this.flags.masks.F5,!!(32&a)),this.registers.set("F",r),16}cpdr(){const t=this.cpd(),s=!this.flags.getFlag(this.registers.get("F"),this.flags.masks.Z);if(0!==this.registers.getBC()&&s){this.registers.setPC(this.registers.getPC()-2&65535);let t=this.registers.get("F");return t=this.flags.setFlag(t,this.flags.masks.PV,!0),this.registers.set("F",t),21}if(!s){let t=this.registers.get("F");t=this.flags.setFlag(t,this.flags.masks.PV,!1),this.registers.set("F",t)}return t}sbcHL(t){const s=this.flags.getFlag(this.registers.get("F"),this.flags.masks.C)?1:0,e=this.registers.getHL(),i=e-t-s&131071;let r=this.registers.get("F");r=this.flags.setFlag(r,this.flags.masks.C,!!(65536&i)),r=this.flags.setFlag(r,this.flags.masks.H,(4095&e)-(4095&t)-s<0),r=this.flags.setFlag(r,this.flags.masks.N,!0),r=this.flags.setFlag(r,this.flags.masks.S,!!(32768&i)),r=this.flags.setFlag(r,this.flags.masks.Z,!(65535&i));const a=!!(32768&(e^t))&&!!(32768&(e^i));r=this.flags.setFlag(r,this.flags.masks.PV,a);const h=i>>8&255;return r=this.flags.setFlag(r,this.flags.masks.F5,!!(32&h)),r=this.flags.setFlag(r,this.flags.masks.F3,!!(8&h)),this.registers.setHL(65535&i),this.registers.set("F",r),15}adcHL(t){const s=this.flags.getFlag(this.registers.get("F"),this.flags.masks.C)?1:0,e=this.registers.getHL(),i=e+t+s&131071;let r=this.registers.get("F");r=this.flags.setFlag(r,this.flags.masks.C,!!(65536&i)),r=this.flags.setFlag(r,this.flags.masks.H,(4095&e)+(4095&t)+s>4095),r=this.flags.setFlag(r,this.flags.masks.N,!1),r=this.flags.setFlag(r,this.flags.masks.S,!!(32768&i)),r=this.flags.setFlag(r,this.flags.masks.Z,!(65535&i));const a=!(32768&(e^t)||!(32768&(e^i)));r=this.flags.setFlag(r,this.flags.masks.PV,a);const h=i>>8&255;return r=this.flags.setFlag(r,this.flags.masks.F5,!!(32&h)),r=this.flags.setFlag(r,this.flags.masks.F3,!!(8&h)),this.registers.setHL(65535&i),this.registers.set("F",r),15}rld(){const t=this.registers.getHL(),s=this.memory.readByte(t),e=this.registers.get("A"),i=255&(s<<4|15&e),r=240&e|s>>4&15;this.memory.writeByte(t,i),this.registers.set("A",r);let a=this.registers.get("F");return a=this.flags.setFlag(a,this.flags.masks.H,!1),a=this.flags.setFlag(a,this.flags.masks.N,!1),a=this.flags.updateFlags(a,r,"logical"),this.registers.set("F",a),18}rrd(){const t=this.registers.getHL(),s=this.memory.readByte(t),e=this.registers.get("A"),i=255&(e<<4|s>>4),r=240&e|15&s;this.memory.writeByte(t,i),this.registers.set("A",r);let a=this.registers.get("F");return a=this.flags.setFlag(a,this.flags.masks.H,!1),a=this.flags.setFlag(a,this.flags.masks.N,!1),a=this.flags.updateFlags(a,r,"logical"),this.registers.set("F",a),18}_applyInOutFlags(t=!1){let s=this.registers.get("F");return s=this.flags.setFlag(s,this.flags.masks.Z,0===this.registers.get("B")),s=this.flags.setFlag(s,this.flags.masks.N,!1),t||(s=this.flags.setFlag(s,this.flags.masks.PV,0===this.registers.get("B"))),s}ini(){const t=this.io.readPort(this.registers.getBC());return this.memory.writeByte(this.registers.getHL(),t),this.registers.setHL(this.registers.getHL()+1&65535),this.registers.set("B",this.registers.get("B")-1&255),this.registers.set("F",this._applyInOutFlags()),16}ind(){const t=this.io.readPort(this.registers.getBC());return this.memory.writeByte(this.registers.getHL(),t),this.registers.setHL(this.registers.getHL()-1&65535),this.registers.set("B",this.registers.get("B")-1&255),this.registers.set("F",this._applyInOutFlags()),16}outi(){this.registers.set("B",this.registers.get("B")-1&255);const t=this.memory.readByte(this.registers.getHL());return this.io.writePort(this.registers.getBC(),t),this.registers.setHL(this.registers.getHL()+1&65535),this.registers.set("F",this._applyInOutFlags()),16}outd(){this.registers.set("B",this.registers.get("B")-1&255);const t=this.memory.readByte(this.registers.getHL());return this.io.writePort(this.registers.getBC(),t),this.registers.setHL(this.registers.getHL()-1&65535),this.registers.set("F",this._applyInOutFlags()),16}inir(){const t=this.io.readPort(this.registers.getBC());if(this.memory.writeByte(this.registers.getHL(),t),this.registers.setHL(this.registers.getHL()+1&65535),this.registers.set("B",this.registers.get("B")-1&255),0!==this.registers.get("B")){let t=this._applyInOutFlags(!0);return t=this.flags.setFlag(t,this.flags.masks.PV,!0),this.registers.set("F",t),this.registers.setPC(this.registers.getPC()-2&65535),21}return this.registers.set("F",this._applyInOutFlags(!1)),16}indr(){const t=this.io.readPort(this.registers.getBC());if(this.memory.writeByte(this.registers.getHL(),t),this.registers.setHL(this.registers.getHL()-1&65535),this.registers.set("B",this.registers.get("B")-1&255),0!==this.registers.get("B")){let t=this._applyInOutFlags(!0);return t=this.flags.setFlag(t,this.flags.masks.PV,!0),this.registers.set("F",t),this.registers.setPC(this.registers.getPC()-2&65535),21}return this.registers.set("F",this._applyInOutFlags(!1)),16}otir(){this.registers.set("B",this.registers.get("B")-1&255);const t=this.memory.readByte(this.registers.getHL());if(this.io.writePort(this.registers.getBC(),t),this.registers.setHL(this.registers.getHL()+1&65535),0!==this.registers.get("B")){let t=this._applyInOutFlags(!0);return t=this.flags.setFlag(t,this.flags.masks.PV,!0),this.registers.set("F",t),this.registers.setPC(this.registers.getPC()-2&65535),21}return this.registers.set("F",this._applyInOutFlags(!1)),16}otdr(){this.registers.set("B",this.registers.get("B")-1&255);const t=this.memory.readByte(this.registers.getHL());if(this.io.writePort(this.registers.getBC(),t),this.registers.setHL(this.registers.getHL()-1&65535),0!==this.registers.get("B")){let t=this._applyInOutFlags(!0);return t=this.flags.setFlag(t,this.flags.masks.PV,!0),this.registers.set("F",t),this.registers.setPC(this.registers.getPC()-2&65535),21}return this.registers.set("F",this._applyInOutFlags(!1)),16}}class u{constructor(t,s,e,i){this.registers=t,this.flags=s,this.memory=e,this.getArithmetic=i.getArithmetic,this.getLogical=i.getLogical,this.getLoad=i.getLoad,this.getBit=i.getBit}addIndex(t,s){const e=this.registers.get16(t),i=e+s;let r=this.registers.get("F");r=this.flags.setFlag(r,this.flags.masks.C,i>65535),r=this.flags.setFlag(r,this.flags.masks.H,(4095&e)+(4095&s)>4095),r=this.flags.setFlag(r,this.flags.masks.N,!1);const a=i>>8&255;return r=this.flags.setFlag(r,this.flags.masks.F5,!!(32&a)),r=this.flags.setFlag(r,this.flags.masks.F3,!!(8&a)),this.registers.set16(t,65535&i),this.registers.set("F",r),15}loadRegFromIndexed(t,s,e){const i=n(e),r=this.registers.get16(s)+i&65535;return this.registers.set(t,this.memory.readByte(r)),19}loadIndexedFromReg(t,s,e){const i=n(s),r=this.registers.get16(t)+i&65535;return this.memory.writeByte(r,this.registers.get(e)),19}loadIndexedImmediate(t,s,e){const i=n(s),r=this.registers.get16(t)+i&65535;return this.memory.writeByte(r,e),19}addAIndexed(t,s){const e=n(s),i=this.registers.get16(t)+e&65535,r=this.memory.readByte(i);return this.getArithmetic().addA(r),19}adcAIndexed(t,s){const e=n(s),i=this.registers.get16(t)+e&65535,r=this.memory.readByte(i);return this.getArithmetic().adcA(r),19}subAIndexed(t,s){const e=n(s),i=this.registers.get16(t)+e&65535,r=this.memory.readByte(i);return this.getArithmetic().subA(r),19}sbcAIndexed(t,s){const e=n(s),i=this.registers.get16(t)+e&65535,r=this.memory.readByte(i);return this.getArithmetic().sbcA(r),19}andAIndexed(t,s){const e=n(s),i=this.registers.get16(t)+e&65535,r=this.memory.readByte(i);return this.getLogical().andA(r),19}xorAIndexed(t,s){const e=n(s),i=this.registers.get16(t)+e&65535,r=this.memory.readByte(i);return this.getLogical().xorA(r),19}orAIndexed(t,s){const e=n(s),i=this.registers.get16(t)+e&65535,r=this.memory.readByte(i);return this.getLogical().orA(r),19}cpAIndexed(t,s){const e=n(s),i=this.registers.get16(t)+e&65535,r=this.memory.readByte(i);return this.getArithmetic().cpA(r),19}incIndexed(t,s){const e=n(s),i=this.registers.get16(t)+e&65535,r=this.memory.readByte(i),a=r+1&255;this.memory.writeByte(i,a);const h=this.flags.updateIncFlags(this.registers.get("F"),r,a);return this.registers.set("F",h),23}decIndexed(t,s){const e=n(s),i=this.registers.get16(t)+e&65535,r=this.memory.readByte(i),a=r-1&255;this.memory.writeByte(i,a);const h=this.flags.updateDecFlags(this.registers.get("F"),r,a);return this.registers.set("F",h),23}jumpIndexed(t){return this.registers.setPC(this.registers.get16(t)),8}exchangeSPIndexed(t){const s=this.memory.readWord(this.registers.get16("SP"));return this.memory.writeWord(this.registers.get16("SP"),this.registers.get16(t)),this.registers.set16(t,s),23}pushIndexed(t){const s=this.registers.get16(t);return this.memory.pushWord(this.registers,s),15}popIndexed(t){const s=this.memory.popWord(this.registers);return this.registers.set16(t,s),14}processIndexedBitOp(t,s,e,i,r=null){const a=n(s),h=this.registers.get16(t)+a&65535,o=this.memory.readByte(h),l=this.getBit();let g,c=20;switch(e){case"BIT":{const t=this.flags.updateBitTestFlags(this.registers.get("F"),i,o);return this.registers.set("F",t),c}case"SET":g=o|1<<i,c=23;break;case"RES":g=o&~(1<<i),c=23;break;case"RLC":g=l.rlc(o),c=23;break;case"RRC":g=l.rrc(o),c=23;break;case"RL":g=l.rl(o),c=23;break;case"RR":g=l.rr(o),c=23;break;case"SLA":g=l.sla(o),c=23;break;case"SRA":g=l.sra(o),c=23;break;case"SLL":g=l.sll(o),c=23;break;case"SRL":g=l.srl(o),c=23;break;default:return c}return this.memory.writeByte(h,g),r&&"NONE"!==r&&this.registers.set(r,g),c}getRegisterFromIndex(t){return["B","C","D","E","H","L","NONE","A"][t]||"NONE"}processIndexedCB(t,s,e){const i=7&e,r=this.getRegisterFromIndex(i);if(64==(192&e)){const i=e>>3&7;return this.processIndexedBitOp(t,s,"BIT",i)}if(128==(192&e)){const i=e>>3&7;return this.processIndexedBitOp(t,s,"RES",i,r)}if(192&~e){let i;switch(248&e){case 0:i="RLC";break;case 8:i="RRC";break;case 16:i="RL";break;case 24:i="RR";break;case 32:i="SLA";break;case 40:i="SRA";break;case 48:i="SLL";break;case 56:i="SRL";break;default:return 23}return this.processIndexedBitOp(t,s,i,0,r)}{const i=e>>3&7;return this.processIndexedBitOp(t,s,"SET",i,r)}}}class m{constructor(t,s,e,i,r){this.registers=t,this.flags=s,this.memory=e,this.io=i,this.instructions=r,this.buildAllInstructionTables()}buildAllInstructionTables(){this.mainTable={},this.cbTable={},this.edTable={},this.ddTable={},this.fdTable={},this.ddcbTable={},this.fdcbTable={},this.buildMainTable(),this.buildCBTable(),this.buildEDTable(),this.buildDDTable(),this.buildFDTable()}buildMainTable(){const{logical:t,load:s}=this.instructions,e=["B","C","D","E","H","L",null,"A"];for(let t=0;t<8;t++)for(let i=0;i<8;i++){if(6===t&&6===i){this.mainTable[118]=t=>this.instructions.misc.halt(t);continue}const r=64+(t<<3)+i;this.mainTable[r]=6===t?()=>s.loadHLFromReg(e[i]):6===i?()=>s.loadRegFromHL(e[t]):()=>s.loadRegReg(e[t],e[i])}for(let s=0;s<8;s++){const i=e[s];i?(this.mainTable[128+s]=()=>this.instructions.arithmetic.addA(this.registers.get(i)),this.mainTable[136+s]=()=>this.instructions.arithmetic.adcA(this.registers.get(i)),this.mainTable[144+s]=()=>this.instructions.arithmetic.subA(this.registers.get(i)),this.mainTable[152+s]=()=>this.instructions.arithmetic.sbcA(this.registers.get(i)),this.mainTable[160+s]=()=>t.andA(this.registers.get(i)),this.mainTable[168+s]=()=>t.xorA(this.registers.get(i)),this.mainTable[176+s]=()=>t.orA(this.registers.get(i)),this.mainTable[184+s]=()=>this.instructions.arithmetic.cpA(this.registers.get(i))):6===s&&(this.mainTable[134]=()=>(this.instructions.arithmetic.addA(this.memory.readByte(this.registers.getHL())),7),this.mainTable[142]=()=>(this.instructions.arithmetic.adcA(this.memory.readByte(this.registers.getHL())),7),this.mainTable[150]=()=>(this.instructions.arithmetic.subA(this.memory.readByte(this.registers.getHL())),7),this.mainTable[158]=()=>(this.instructions.arithmetic.sbcA(this.memory.readByte(this.registers.getHL())),7),this.mainTable[166]=()=>(t.andA(this.memory.readByte(this.registers.getHL())),7),this.mainTable[174]=()=>(t.xorA(this.memory.readByte(this.registers.getHL())),7),this.mainTable[182]=()=>(t.orA(this.memory.readByte(this.registers.getHL())),7),this.mainTable[190]=()=>(this.instructions.arithmetic.cpA(this.memory.readByte(this.registers.getHL())),7))}this.buildMainInstructions()}buildMainInstructions(){const{logical:t,load:s,jump:e,bit:i}=this.instructions;this.mainTable[0]=()=>this.instructions.misc.nop(),this.mainTable[1]=()=>s.loadReg16Immediate("BC",this.memory.fetchWord(this.registers)),this.mainTable[17]=()=>s.loadReg16Immediate("DE",this.memory.fetchWord(this.registers)),this.mainTable[33]=()=>s.loadReg16Immediate("HL",this.memory.fetchWord(this.registers)),this.mainTable[49]=()=>s.loadReg16Immediate("SP",this.memory.fetchWord(this.registers)),this.mainTable[6]=()=>s.loadRegImmediate("B",this.memory.fetchByte(this.registers)),this.mainTable[14]=()=>s.loadRegImmediate("C",this.memory.fetchByte(this.registers)),this.mainTable[22]=()=>s.loadRegImmediate("D",this.memory.fetchByte(this.registers)),this.mainTable[30]=()=>s.loadRegImmediate("E",this.memory.fetchByte(this.registers)),this.mainTable[38]=()=>s.loadRegImmediate("H",this.memory.fetchByte(this.registers)),this.mainTable[46]=()=>s.loadRegImmediate("L",this.memory.fetchByte(this.registers)),this.mainTable[62]=()=>s.loadRegImmediate("A",this.memory.fetchByte(this.registers)),this.mainTable[54]=()=>s.loadHLImmediate(this.memory.fetchByte(this.registers)),this.mainTable[4]=()=>this.instructions.arithmetic.incReg("B"),this.mainTable[12]=()=>this.instructions.arithmetic.incReg("C"),this.mainTable[20]=()=>this.instructions.arithmetic.incReg("D"),this.mainTable[28]=()=>this.instructions.arithmetic.incReg("E"),this.mainTable[36]=()=>this.instructions.arithmetic.incReg("H"),this.mainTable[44]=()=>this.instructions.arithmetic.incReg("L"),this.mainTable[60]=()=>this.instructions.arithmetic.incReg("A"),this.mainTable[52]=()=>this.instructions.arithmetic.incHL(),this.mainTable[5]=()=>this.instructions.arithmetic.decReg("B"),this.mainTable[13]=()=>this.instructions.arithmetic.decReg("C"),this.mainTable[21]=()=>this.instructions.arithmetic.decReg("D"),this.mainTable[29]=()=>this.instructions.arithmetic.decReg("E"),this.mainTable[37]=()=>this.instructions.arithmetic.decReg("H"),this.mainTable[45]=()=>this.instructions.arithmetic.decReg("L"),this.mainTable[61]=()=>this.instructions.arithmetic.decReg("A"),this.mainTable[53]=()=>this.instructions.arithmetic.decHL(),this.mainTable[3]=()=>(this.registers.inc16("BC"),6),this.mainTable[19]=()=>(this.registers.inc16("DE"),6),this.mainTable[35]=()=>(this.registers.inc16("HL"),6),this.mainTable[51]=()=>(this.registers.inc16("SP"),6),this.mainTable[11]=()=>(this.registers.dec16("BC"),6),this.mainTable[27]=()=>(this.registers.dec16("DE"),6),this.mainTable[43]=()=>(this.registers.dec16("HL"),6),this.mainTable[59]=()=>(this.registers.dec16("SP"),6),this.mainTable[9]=()=>this.instructions.arithmetic.addHL(this.registers.getBC()),this.mainTable[25]=()=>this.instructions.arithmetic.addHL(this.registers.getDE()),this.mainTable[41]=()=>this.instructions.arithmetic.addHL(this.registers.getHL()),this.mainTable[57]=()=>this.instructions.arithmetic.addHL(this.registers.get16("SP")),this.mainTable[198]=()=>(this.instructions.arithmetic.addA(this.memory.fetchByte(this.registers)),7),this.mainTable[206]=()=>(this.instructions.arithmetic.adcA(this.memory.fetchByte(this.registers)),7),this.mainTable[214]=()=>(this.instructions.arithmetic.subA(this.memory.fetchByte(this.registers)),7),this.mainTable[222]=()=>(this.instructions.arithmetic.sbcA(this.memory.fetchByte(this.registers)),7),this.mainTable[230]=()=>(t.andA(this.memory.fetchByte(this.registers)),7),this.mainTable[238]=()=>(t.xorA(this.memory.fetchByte(this.registers)),7),this.mainTable[246]=()=>(t.orA(this.memory.fetchByte(this.registers)),7),this.mainTable[254]=()=>(this.instructions.arithmetic.cpA(this.memory.fetchByte(this.registers)),7),this.mainTable[195]=()=>e.jump(this.memory.fetchWord(this.registers)),this.mainTable[24]=()=>e.jumpRelative(this.memory.fetchByte(this.registers)),this.mainTable[233]=()=>e.jumpHL(),this.mainTable[205]=()=>e.call(this.memory.fetchWord(this.registers)),this.mainTable[201]=()=>e.ret(),this.addConditionalInstructions(),this.mainTable[197]=()=>this.instructions.misc.push("BC"),this.mainTable[213]=()=>this.instructions.misc.push("DE"),this.mainTable[229]=()=>this.instructions.misc.push("HL"),this.mainTable[245]=()=>this.instructions.misc.push("AF"),this.mainTable[193]=()=>this.instructions.misc.pop("BC"),this.mainTable[209]=()=>this.instructions.misc.pop("DE"),this.mainTable[225]=()=>this.instructions.misc.pop("HL"),this.mainTable[241]=()=>this.instructions.misc.pop("AF"),this.mainTable[7]=()=>i.rlca(),this.mainTable[15]=()=>i.rrca(),this.mainTable[23]=()=>i.rla(),this.mainTable[31]=()=>i.rra(),this.mainTable[55]=()=>t.scf(),this.mainTable[63]=()=>t.ccf(),this.mainTable[39]=()=>t.daa(),this.mainTable[47]=()=>t.cpl(),this.mainTable[243]=t=>this.instructions.misc.di(t),this.mainTable[251]=t=>this.instructions.misc.ei(t),this.mainTable[8]=()=>this.instructions.misc.exAF(),this.mainTable[217]=()=>this.instructions.misc.exx(),this.mainTable[235]=()=>this.instructions.misc.exDEHL(),this.mainTable[227]=()=>this.instructions.misc.exSPHL(),this.mainTable[219]=()=>this.instructions.misc.inAImmediate(this.memory.fetchByte(this.registers),this.io),this.mainTable[211]=()=>this.instructions.misc.outAImmediate(this.memory.fetchByte(this.registers),this.io),this.addMemoryInstructions(),this.addRSTInstructions(),this.mainTable[16]=()=>e.djnz(this.memory.fetchByte(this.registers)),this.mainTable[249]=()=>s.loadSPFromHL(),this.mainTable[203]=t=>this.executeCBInstruction(t),this.mainTable[237]=t=>this.executeEDInstruction(t),this.mainTable[221]=t=>this.executeDDInstruction(t),this.mainTable[253]=t=>this.executeFDInstruction(t)}addConditionalInstructions(){const{jump:t}=this.instructions;this.mainTable[194]=()=>t.jumpConditional("NZ",this.memory.fetchWord(this.registers)),this.mainTable[202]=()=>t.jumpConditional("Z",this.memory.fetchWord(this.registers)),this.mainTable[210]=()=>t.jumpConditional("NC",this.memory.fetchWord(this.registers)),this.mainTable[218]=()=>t.jumpConditional("C",this.memory.fetchWord(this.registers)),this.mainTable[226]=()=>t.jumpConditional("PO",this.memory.fetchWord(this.registers)),this.mainTable[234]=()=>t.jumpConditional("PE",this.memory.fetchWord(this.registers)),this.mainTable[242]=()=>t.jumpConditional("P",this.memory.fetchWord(this.registers)),this.mainTable[250]=()=>t.jumpConditional("M",this.memory.fetchWord(this.registers)),this.mainTable[32]=()=>t.jumpRelativeConditional("NZ",this.memory.fetchByte(this.registers)),this.mainTable[40]=()=>t.jumpRelativeConditional("Z",this.memory.fetchByte(this.registers)),this.mainTable[48]=()=>t.jumpRelativeConditional("NC",this.memory.fetchByte(this.registers)),this.mainTable[56]=()=>t.jumpRelativeConditional("C",this.memory.fetchByte(this.registers)),this.mainTable[196]=()=>t.callConditional("NZ",this.memory.fetchWord(this.registers)),this.mainTable[204]=()=>t.callConditional("Z",this.memory.fetchWord(this.registers)),this.mainTable[212]=()=>t.callConditional("NC",this.memory.fetchWord(this.registers)),this.mainTable[220]=()=>t.callConditional("C",this.memory.fetchWord(this.registers)),this.mainTable[228]=()=>t.callConditional("PO",this.memory.fetchWord(this.registers)),this.mainTable[236]=()=>t.callConditional("PE",this.memory.fetchWord(this.registers)),this.mainTable[244]=()=>t.callConditional("P",this.memory.fetchWord(this.registers)),this.mainTable[252]=()=>t.callConditional("M",this.memory.fetchWord(this.registers)),this.mainTable[192]=()=>t.retConditional("NZ"),this.mainTable[200]=()=>t.retConditional("Z"),this.mainTable[208]=()=>t.retConditional("NC"),this.mainTable[216]=()=>t.retConditional("C"),this.mainTable[224]=()=>t.retConditional("PO"),this.mainTable[232]=()=>t.retConditional("PE"),this.mainTable[240]=()=>t.retConditional("P"),this.mainTable[248]=()=>t.retConditional("M")}addMemoryInstructions(){const{load:t}=this.instructions;this.mainTable[2]=()=>t.loadBCFromA(),this.mainTable[18]=()=>t.loadDEFromA(),this.mainTable[10]=()=>t.loadAFromBC(),this.mainTable[26]=()=>t.loadAFromDE(),this.mainTable[34]=()=>t.loadAddressFromHL(this.memory.fetchWord(this.registers)),this.mainTable[42]=()=>t.loadHLFromAddress(this.memory.fetchWord(this.registers)),this.mainTable[50]=()=>t.loadAddressFromA(this.memory.fetchWord(this.registers)),this.mainTable[58]=()=>t.loadAFromAddress(this.memo