/*!  NanoWasp - A MicroBee emulator
 *  Copyright (C) 2007, 2011 David G. Churchill
 *
 *  This file is part of NanoWasp.
 *
 *  NanoWasp 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 3 of the License, or
 *  (at your option) any later version.
 *
 *  NanoWasp 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, see <http://www.gnu.org/licenses/>.
 */
var nanowasp=nanowasp||{};nanowasp.NanoWasp=function(){this._sendKeysToMicrobee=true};nanowasp.NanoWasp.prototype={main:function(){var h={};var e=nanowasp.Keyboard.prototype.keyMap;for(var d=0;d<e.length;++d){h[e[d]]=true}var c=(function(i){return function(l){return !i._sendKeysToMicrobee||l.metaKey||!(l.keyCode in h)}})(this);var f=[];window.onkeydown=function(i){if(c(i)){return true}f[i.keyCode]=true;return false};window.onkeypress=function(i){return c(i)};window.onkeyup=function(i){if(c(i)){return true}f[i.keyCode]=false;return false};document.getElementById("hide_notice_button").onclick=function(){document.getElementById("notice").style.display="none"};var j=document.getElementById("vdu").getContext("2d");this.microbee=new nanowasp.MicroBee(j,f);var g=this.microbee;document.getElementById("tape_menuitem").addEventListener("click",utils.bind(this._toggleTapesMenu,this),false);nanowasp.tapes={};for(var a in nanowasp.data.mwbs){nanowasp.tapes[a]=nanowasp.VirtualTape.createAutoTape(a,utils.decodeBase64(nanowasp.data.mwbs[a]))}var k=document.getElementById("tape_file");var b=utils.bind(this._update_tapes,this);k.onchange=function(){for(var m=0;m<k.files.length;++m){var l=k.files[m];if(l.size>65535){continue}(function(n){var i=new FileReader();i.onload=function(r){var q=utils.makeUint8Array(i.result.length);for(var o=0;o<q.length;++o){q[o]=i.result.charCodeAt(o)}nanowasp.tapes[n.fileName]=nanowasp.VirtualTape.createAutoTape(n.fileName,q);b()};i.readAsBinaryString(n)})(l)}};this._update_tapes();this._debugger=new nanowasp.Debugger("registers");document.getElementById("debugger_button").onclick=utils.bind(this._show_debugger,this);document.getElementById("reset_button").onclick=function(){g.reset()};window.onblur=utils.bind(g.stop,g);window.onfocus=utils.bind(g.start,g);g.start()},_toggleTapesMenu:function(){var a=utils.toggleHtmlClass("tape_menu","selected");this._sendKeysToMicrobee=!a},_hideTapesMenu:function(){utils.removeHtmlClass("tape_menu","selected");this._sendKeysToMicrobee=true},_loadTape:function(a){this.microbee.loadTape(a);var b=document.getElementById("selected_tape_name");b.innerHTML="";b.appendChild(document.createTextNode(a.name))},_onTapeSelected:function(a){this._loadTape(a);this._hideTapesMenu()},_onTapeEdited:function(a){this._loadTape(a)},_update_tapes:function(){var b=utils.bind(this._onTapeSelected,this);var e=utils.bind(this._onTapeEdited,this);var f=document.createDocumentFragment();for(var c in nanowasp.tapes){var a=document.createElement("li");a.className="menuitem";new nanowasp.TapeView(nanowasp.tapes[c],a,b,e);f.appendChild(a)}var d=document.getElementById("tapes");d.innerHTML="";d.appendChild(f)},_show_debugger:function(){var a=this._debugger;a.update();utils.removeHtmlClass("debugger","hidden");this.microbee.setSliceDoneCallback(function(){a.update()});var b=document.getElementById("debugger_button");utils.setTextContent(b,"Hide Debugger");b.onclick=utils.bind(this._hide_debugger,this)},_hide_debugger:function(){utils.addHtmlClass("debugger","hidden");this.microbee.setSliceDoneCallback(null);var a=document.getElementById("debugger_button");utils.setTextContent(a,"Show Debugger");a.onclick=utils.bind(this._show_debugger,this)}};window.onload=function(){try{nw=new nanowasp.NanoWasp();nw.main()}catch(a){if(typeof(console)!="undefined"&&console.log){console.log(a)}var b=document.getElementById("error_message");b.innerHTML='Unfortunately your browser does not support some features required by NanoWasp. Try updating your browser to the latest version. <a href="http://www.google.com/chrome">Chrome</a> is recommended for best performance.';b.style.display="block"}};var nanowasp=nanowasp||{};nanowasp.Crtc=function(a){this.reset();this._graphicsContext=a};nanowasp.Crtc.prototype={reset:function(){this._selectedRegister=0;this._lpenValid=false;this._lpen=0;this._emulationTime=0;this._lastFrameTime=0;this._frameTime=1;this._vblankTime=0;this._cursorPosition=0;this._cursorStart=0;this._cursorEnd=0;this._cursorMode=this.CursorMode.NoBlink;this._cursorOn=false;this._blinkRate=0;this._frameCounter=0;this._displayStart=0;this._hTotal=0;this._hDisplayed=0;this._vTotal=0;this._vTotalAdjustment=0;this._vDisplayed=0;this._scansPerRow=0;this._memoryAddress=0;this._previousRenderState=[];this._lastCursorPosition=0},restoreState:function(a){this._selectedRegister=a.readByte();this._memoryAddress=a.readWord();this._displayStart=a.readWord();this._hTotal=a.readWord();this._hDisplayed=a.readWord();this._vTotal=a.readWord();this._vTotalAdjustment=a.readWord();this._vDisplayed=a.readWord();this._scansPerRow=a.readWord();this._cursorStart=a.readWord();this._cursorEnd=a.readWord();this._cursorMode=a.readWord();this._cursorPosition=a.readWord();this._cursorOn=a.readBool();this._blinkRate=a.readWord();this._lpen=a.readWord();this._lpenValid=a.readBool();this._calculateVBlank()},getSize:function(){return this.PortIndex.NumPorts},connect:function(c,a,b){this._microbee=c;this._keyboard=a;this._crtcMemory=b},read:function(b){switch(b%this.PortIndex.NumPorts){case this.PortIndex.Status:var d=128;var c=64;var e=32;var a=d;if(!this._lpenValid){this._keyboard.checkAll()}if(this._lpenValid){a|=c}if(this._microbee.getTime()%this._frameTime<this._vblankTime){a|=e}return a;case this.PortIndex.Data:switch(this._selectedRegister){case this.RegisterIndex.CursorPosH:return utils.getBits(this._cursorPosition,8,6);case this.RegisterIndex.CursorPosL:return utils.getBits(this._cursorPosition,0,8);case this.RegisterIndex.LPenH:this._lpenValid=false;return utils.getBits(this._lpen,8,6);case this.RegisterIndex.LPenL:this._lpenValid=false;return utils.getBits(this._lpen,0,8);default:return 255}default:return 255}},write:function(a,c){switch(a%this.PortIndex.NumPorts){case this.PortIndex.Address:this._selectedRegister=c%this.RegisterIndex.NumRegs;break;case this.PortIndex.Data:switch(this._selectedRegister){case this.RegisterIndex.HTot:this._hTotal=c+1;this._calculateVBlank();break;case this.RegisterIndex.HDisp:this._hDisplayed=c;break;case this.RegisterIndex.VTot:this._vTotal=utils.getBits(c,0,7)+1;this._calculateVBlank();break;case this.RegisterIndex.VTotAdj:this._vTotalAdjustment=utils.getBits(c,0,5);this._calculateVBlank();break;case this.RegisterIndex.VDisp:this._vDisplayed=utils.getBits(c,0,7);break;case this.RegisterIndex.Scanlines:this._scansPerRow=utils.getBits(c,0,5)+1;this._calculateVBlank();break;case this.RegisterIndex.CursorStart:var b=5;this._cursorStart=utils.getBits(c,0,5);this._cursorMode=utils.getBits(c,b,2);switch(this._cursorMode){case this.CursorMode.NoBlink:this._cursorOn=true;this._blinkRate=0;break;case this.CursorMode.NoCursor:this._cursorOn=false;this._blinkRate=0;break;case this.CursorMode.Blink16:this._blinkRate=16;break;case this.CursorMode.Blink32:this._blinkRate=32;break}break;case this.RegisterIndex.CursorEnd:this._cursorEnd=utils.getBits(c,0,5);break;case this.RegisterIndex.DispStartH:this._displayStart=utils.copyBits(this._displayStart,8,6,c);break;case this.RegisterIndex.DispStartL:this._displayStart=utils.copyBits(this._displayStart,0,8,c);break;case this.RegisterIndex.CursorPosH:this._cursorPosition=utils.copyBits(this._cursorPosition,8,6,c);break;case this.RegisterIndex.CursorPosL:this._cursorPosition=utils.copyBits(this._cursorPosition,0,8,c);break;case this.RegisterIndex.SetAddrH:this._memoryAddress=utils.copyBits(this._memoryAddress,8,6,c);break;case this.RegisterIndex.SetAddrL:this._memoryAddress=utils.copyBits(this._memoryAddress,0,8,c);break;case this.RegisterIndex.DoSetAddr:this._keyboard.check(this._memoryAddress);break}break}},execute:function(b,a){this._emulationTime=b+a;var c=this._emulationTime-this._lastFrameTime;if(c>=this._frameTime){this._render();this._frameCounter+=Math.floor(c/this._frameTime);this._lastFrameTime=this._emulationTime-c%this._frameTime;if(this._blinkRate>0&&this._frameCounter>this._blinkRate){this._cursorOn=!this._cursorOn;this._frameCounter%=this._blinkRate}}return this._lastFrameTime+this._frameTime-this._emulationTime},triggerLpen:function(a){if(this._lpenValid){return}this._lpenValid=true;this._lpen=a},getDisplayStart:function(){return this._displayStart},_calculateVBlank:function(){var a=1687500;this._graphicsContext.canvas.width=this._hDisplayed*nanowasp.CrtcMemory.prototype.CHAR_WIDTH;this._graphicsContext.canvas.height=this._vDisplayed*this._scansPerRow;this._frameTime=this._hTotal*(this._vTotal*this._scansPerRow+this._vTotalAdjustment)*1000000/a;this._vblankTime=this._hTotal*((this._vTotal-this._vDisplayed)*this._scansPerRow+this._vTotalAdjustment)*1000000/a;if(this._frameTime==0){this._frameTime=1}},_render:function(){var d=[this._displayStart,this._vDisplayed,this._hDisplayed,this._scansPerRow];var h=false;if(!utils.listsMatch(this._previousRenderState,d)){h=true;this._previousRenderState=d}if(h){this._graphicsContext.fillStyle=nanowasp.CrtcMemory.prototype.BACKGROUND_COLOR_CSS;this._graphicsContext.fillRect(0,0,this._graphicsContext.canvas.width,this._graphicsContext.canvas.height)}var g=this._displayStart;var f=0;var e=0;for(var j=0;j<this._vDisplayed;++j){for(var c=0;c<this._hDisplayed;++c){var i=null;if(this._cursorOn&&g==this._cursorPosition){i=[this._cursorStart,this._cursorEnd]}if(h||i!=null||g==this._lastCursorPosition||this._crtcMemory.isDirty(g)){var b=this._crtcMemory.getCharacterData(g,this._scansPerRow,i);this._graphicsContext.putImageData(b,f,e,0,0,nanowasp.CrtcMemory.prototype.CHAR_WIDTH,this._scansPerRow)}f+=nanowasp.CrtcMemory.prototype.CHAR_WIDTH;var a=16384;g=(g+1)%a}e+=this._scansPerRow;f=0}this._lastCursorPosition=this._cursorPosition;this._crtcMemory.clearDirtyStatus()},RegisterIndex:{HTot:0,HDisp:1,HSyncPos:2,SyncWidth:3,VTot:4,VTotAdj:5,VDisp:6,VSyncPos:7,Mode:8,Scanlines:9,CursorStart:10,CursorEnd:11,DispStartH:12,DispStartL:13,CursorPosH:14,CursorPosL:15,LPenH:16,LPenL:17,SetAddrH:18,SetAddrL:19,DoSetAddr:31,NumRegs:32},PortIndex:{Address:0,Status:0,Data:1,NumPorts:2},CursorMode:{NoBlink:0,NoCursor:1,Blink16:2,Blink32:3}};if(Object.freeze!=undefined){var p=nanowasp.Crtc.prototype;Object.freeze(p.RegisterIndex);Object.freeze(p.PortIndex);Object.freeze(p.CursorMode)}var nanowasp=nanowasp||{};nanowasp.CrtcMemory=function(b,a){this._charRom=new nanowasp.Rom(b);this._pcgRam=new nanowasp.Ram(this.PCG_RAM_SIZE);this._videoRam=new nanowasp.Ram(this.VIDEO_RAM_SIZE);this._graphicsContext=a;this._pcgImages={};this._charRomImages={};this._buildAllCharacters(this._charRomImages,this._charRom);this.clearDirtyStatus()};nanowasp.CrtcMemory.prototype={GRAPHICS_MEMORY_SIZE:4096,VIDEO_RAM_SIZE:2048,PCG_RAM_SIZE:2048,BIT_MA13:13,CHAR_WIDTH:8,MAX_CHAR_HEIGHT:16,FOREGROUND_COLOR:[247,211,49,220],BACKGROUND_COLOR:[0,0,0,0],BACKGROUND_COLOR_CSS:"rgba(0, 0, 0, 0)",BIT_PCG:7,INDEX_START:0,INDEX_COUNT:7,reset:function(){this._charRom.reset();this._pcgRam.reset();this._videoRam.reset()},restoreState:function(a){this._videoRam.restoreState(a);this._pcgRam.restoreState(a);this._buildAllCharacters(this._pcgImages,this._pcgRam)},connect:function(a,b){this._crtc=a;this._latchRom=b},getSize:function(){return this.GRAPHICS_MEMORY_SIZE},read:function(b){if(b<this.VIDEO_RAM_SIZE){if(this._latchRom.isLatched()){var a=utils.getBit(this._crtc.getDisplayStart(),this.BIT_MA13)*this.VIDEO_RAM_SIZE;return this._charRom.read(a+b)}else{return this._videoRam.read(b)}}else{return this._pcgRam.read((b-this.VIDEO_RAM_SIZE)%this.PCG_RAM_SIZE)}},write:function(a,d){if(a<this.VIDEO_RAM_SIZE){if(!this._latchRom.isLatched()){this._videoRam.write(a,d);this._dirtyVideoRam[a]=true}}else{var b=(a-this.VIDEO_RAM_SIZE)%this.PCG_RAM_SIZE;this._pcgRam.write(b,d);var c=b/this.MAX_CHAR_HEIGHT|0;var e=b%this.MAX_CHAR_HEIGHT;this._pcgImages[c]=this._buildCharacterRow(this._pcgImages[c],d,e);this._dirtyPcgImages[c]=true}},isDirty:function(f){var c=f%this.VIDEO_RAM_SIZE;if(c in this._dirtyVideoRam){return true}var a=this._videoRam.read(f%this.VIDEO_RAM_SIZE);var d=utils.getBit(a,this.BIT_PCG)==1;if(!d){return false}var e=utils.getBits(a,this.INDEX_START,this.INDEX_COUNT);return e in this._dirtyPcgImages},clearDirtyStatus:function(){this._dirtyVideoRam={};this._dirtyPcgImages={}},getCharacterData:function(f,c,g){var a=this._videoRam.read(f%this.VIDEO_RAM_SIZE);var e=utils.getBits(a,this.INDEX_START,this.INDEX_COUNT);var d=utils.getBit(a,this.BIT_PCG)==1;if(!d){e+=utils.getBit(f,this.BIT_MA13)*this.VIDEO_RAM_SIZE/this.MAX_CHAR_HEIGHT}if(g==null||g==undefined){var i=d?this._pcgImages:this._charRomImages;return i[e]}else{var h=d?this._pcgRam:this._charRom;return this._buildCharacter(null,h,e*this.MAX_CHAR_HEIGHT,g)}},_buildAllCharacters:function(a,c){for(var b=0;b<c.getSize()/this.MAX_CHAR_HEIGHT;++b){a[b]=this._buildCharacter(a[b],c,b*this.MAX_CHAR_HEIGHT)}},_buildCharacter:function(d,g,f,e){var a=e!=null&&e!=undefined;for(var b=0;b<this.MAX_CHAR_HEIGHT;++b){var c=g.read(f+b);if(a&&b>=e[0]&&b<=e[1]){c^=255}d=this._buildCharacterRow(d,c,b)}return d},_buildCharacterRow:function(e,d,g){if(e==null||e==undefined){e=this._graphicsContext.createImageData(this.CHAR_WIDTH,this.MAX_CHAR_HEIGHT)}var f=g*this.CHAR_WIDTH*4;for(var c=this.CHAR_WIDTH-1;c>=0;--c){var a=((d&(1<<c))!=0)?this.FOREGROUND_COLOR:this.BACKGROUND_COLOR;for(var b=0;b<a.length;++b){e.data[f++]=a[b]}}return e}};var nanowasp=nanowasp||{};nanowasp.Keyboard=function(a){this._pressedKeys=a};nanowasp.Keyboard.prototype={KEY_START:4,KEY_BITS:6,connect:function(b,a){this._crtc=b;this._latchrom=a},reset:function(){},check:function(a){var b=this.keyMap[utils.getBits(a,this.KEY_START,this.KEY_BITS)];if(this._pressedKeys[b]){this._crtc.triggerLpen(a)}},checkAll:function(){if(this._latchrom.isLatched()){return}for(var a=this.keyMap.length-1;a>=0;--a){if(this._pressedKeys[this.keyMap[a]]){this._crtc.triggerLpen(a<<this.KEY_START);break}}},keyMap:[222,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,219,220,221,192,46,48,49,50,51,52,53,54,55,56,57,186,187,188,189,190,191,27,8,9,34,13,20,35,32,-1,17,-1,-1,-1,-1,-1,16]};var nanowasp=nanowasp||{};nanowasp.LatchRom=function(){this._isLatched=false};nanowasp.LatchRom.prototype={reset:function(){this._isLatched=false},restoreState:function(a){this._isLatched=a.readBool()},read:function(a){return 0},write:function(a,b){this._isLatched=utils.getBit(b,0)==1},getSize:function(){return 1},isLatched:function(){return this._isLatched}};var nanowasp=nanowasp||{};nanowasp.MemMapper=function(){};nanowasp.MemMapper.prototype={connect:function(a,d,c,b){this._z80=a;this._rams=d;this._roms=c;this._crtcMemory=b},reset:function(){this.write(0,0)},restoreState:function(a){this.write(0,a.readByte())},getSize:function(){return 1},read:function(a){return 0},write:function(k,h){var j=7;var l=4;var i=8;var c=16;var d=32;var b=0;var g=32768;var a=g;var m=g+16384;var f=32768;var e=61440;switch(h&j){case 0:case 6:this._z80.registerMemoryDevice(b,this._rams[1]);break;case 1:case 7:this._z80.registerMemoryDevice(b,this._rams[3]);break;case 2:case 4:this._z80.registerMemoryDevice(b,this._rams[0]);break;case 3:case 5:this._z80.registerMemoryDevice(b,this._rams[2]);break}if(h&l){this._z80.registerMemoryDevice(g,this._rams[1])}else{this._z80.registerMemoryDevice(a,this._roms[0]);if(h&d){this._z80.registerMemoryDevice(m,this._roms[2])}else{this._z80.registerMemoryDevice(m,this._roms[1])}}if(!(h&i)){if(h&c){this._z80.registerMemoryDevice(f,this._crtcMemory)}else{this._z80.registerMemoryDevice(e,this._crtcMemory)}}}};var nanowasp=nanowasp||{};nanowasp.Ram=function(a){this._memory=utils.makeUint8Array(a)};nanowasp.Ram.prototype={reset:function(){this._memory=utils.makeUint8Array(this.getSize())},getSize:function(){return this._memory.length},restoreState:function(a){this._memory=a.readBuffer(this.getSize())},read:function(a){return this._memory[a]},write:function(a,b){this._memory[a]=b}};nanowasp.Rom=function(a){this._memory=a};nanowasp.Rom.prototype={reset:function(){},getSize:function(){return this._memory.length},read:function(a){return this._memory[a]},write:function(a,b){}};var nanowasp=nanowasp||{};nanowasp.MicroBee=function(a,c){this._isRunning=false;this._runSlice=utils.bind(this._runSliceBody,this);this._sliceDoneCallback=null;this._devices={};nanowasp.z80cpu=new nanowasp.Z80Cpu();this._devices.z80=nanowasp.z80cpu;this._devices.keyboard=new nanowasp.Keyboard(c);this._devices.latchrom=new nanowasp.LatchRom();this._devices.crtc=new nanowasp.Crtc(a);this._devices.memMapper=new nanowasp.MemMapper();this._devices.rom1=new nanowasp.Rom(utils.decodeBase64(nanowasp.data.roms.basic_5_22e));this._devices.rom2=new nanowasp.Rom(utils.makeUint8Array(16384));this._devices.rom3=new nanowasp.Rom(utils.makeUint8Array(16384));this._devices.ram0=new nanowasp.Ram(32768);this._devices.ram1=new nanowasp.Ram(32768);this._devices.ram2=new nanowasp.Ram(32768);this._devices.ram3=new nanowasp.Ram(32768);this._devices.crtcMemory=new nanowasp.CrtcMemory(utils.decodeBase64(nanowasp.data.roms["char"]),a);this._devices.tapeInjector=new nanowasp.TapeInjector(this._devices.z80);this._runnables=[this._devices.z80,this._devices.crtc];this._runningDevice=null;var d=[this._devices.rom1,this._devices.rom2,this._devices.rom3];var e=[this._devices.ram0,this._devices.ram1,this._devices.ram2,this._devices.ram3];this._devices.memMapper.connect(this._devices.z80,e,d,this._devices.crtcMemory);this._devices.keyboard.connect(this._devices.crtc,this._devices.latchrom);this._devices.crtc.connect(this,this._devices.keyboard,this._devices.crtcMemory);this._devices.crtcMemory.connect(this._devices.crtc,this._devices.latchrom);nanowasp.z80cpu.registerPortDevice(11,this._devices.latchrom);nanowasp.z80cpu.registerPortDevice(12,this._devices.crtc);nanowasp.z80cpu.registerPortDevice(14,this._devices.crtc);nanowasp.z80cpu.registerPortDevice(28,this._devices.crtc);nanowasp.z80cpu.registerPortDevice(30,this._devices.crtc);for(var b=80;b<=87;++b){nanowasp.z80cpu.registerPortDevice(b,this._devices.memMapper)}this.currentTape=null;this.reset()};nanowasp.MicroBee.prototype={MAX_MICROS_TO_RUN:200000,reset:function(){for(var a in this._devices){this._devices[a].reset()}this._emulationTime=0;this._microsToRun=this.MAX_MICROS_TO_RUN},restoreState:function(c){for(var b in c){var a=new utils.BinaryReader(utils.decodeBase64(c[b]));this._devices[b].restoreState(a)}},setSliceDoneCallback:function(a){this._sliceDoneCallback=a},_runSliceBody:function(){var b=this.MAX_MICROS_TO_RUN;for(var d in this._runnables){this._runningDevice=this._runnables[d];var a=this._runningDevice.execute(this._emulationTime,this._microsToRun);if(a!=0){b=Math.min(b,a)}}this._runningDevice=null;this._emulationTime+=this._microsToRun;this._microsToRun=b;if(this._sliceDoneCallback!=null){this._sliceDoneCallback()}if(this._isRunning){var e=(new Date()).getTime()-this._startRealTime;var f=(this._emulationTime-this._startEmulationTime)/1000;var c=f-e;c=Math.max(0,c);window.setTimeout(this._runSlice,c)}},getTime:function(){if(this._runningDevice!=null){return this._emulationTime+this._runningDevice.getCurrentExecutionTime()}return this._emulationTime},start:function(){if(!this._isRunning){this._isRunning=true;this._startRealTime=(new Date()).getTime();this._startEmulationTime=this._emulationTime;this._runSlice()}},stop:function(){this._isRunning=false},getIsRunning:function(){return this._isRunning},loadTape:function(a){this._devices.tapeInjector.loadTape(a);this.currentTape=a}};var utils={getBit:function(a,b){return(a>>b)&1},getBits:function(b,c,a){return(b>>c)%(1<<a)},clearBits:function(b,c,a){return b&~(((1<<a)-1)<<c)},copyBits:function(a,d,b,c){return utils.clearBits(a,d,b)|(utils.getBits(c,0,b)<<d)},addHtmlClass:function(a,e){var d=document.getElementById(a);var c=d.className.split(/\s+/);for(var b=0;b<c.length;++b){if(c[b]==e){return}}c.push(e);d.className=c.join(" ")},removeHtmlClass:function(a,e){var d=document.getElementById(a);var c=d.className.split(/\s+/);var f=[];for(var b=0;b<c.length;++b){if(c[b]!=e){f.push(c[b])}}d.className=f.join(" ")},toggleHtmlClass:function(a,f){var d=document.getElementById(a);var c=d.className.split(/\s+/);var g=[];var e=false;for(var b=0;b<c.length;++b){if(c[b]!=f){g.push(c[b])}else{e=true}}if(!e){g.push(f)}d.className=g.join(" ");return !e},setTextContent:function(a,b){a.innerHTML="";a.appendChild(document.createTextNode(b))},bind:(function(){}).bind==undefined?function(a,b){return function(){a.apply(b,arguments)}}:function(a,b){return a.bind(b)},makeUint8Array:typeof(Uint8Array)=="undefined"?function(c){var a=new Array(c);for(var b=0;b<c;++b){a[b]=0}return a}:function(a){return new Uint8Array(a)},decodeBase64:function(n){var g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var a={};for(var f=0;f<g.length;++f){a[g.charAt(f)]=f}n=n.replace(/=/g,"");var h=(n.length/4|0)*3;if(n.length%4>0){h+=n.length%4-1}var o=utils.makeUint8Array(h);var k=0;for(var f=0;f<n.length;f+=4){var c=n.substring(f,f+4);var m=3;switch(c.length){case 0:case 1:throw"Unexpected packet length";case 2:m=1;break;case 3:m=2;break}while(c.length<4){c+="A"}var l=0;for(var e=0;e<c.length;++e){var d=a[c[e]];if(d===undefined){throw"Unexpected character"}l<<=6;l|=d}var b=16;while(m>0){o[k++]=(l>>b)&255;m--;b-=8}}return o},listsMatch:function(b,a){if(b.length!=a.length){return false}for(var c=0;c<b.length;++c){if(b[c]!=a[c]){return false}}return true}};utils.BinaryReader=function(a){this._array=a;this._offset=0};utils.BinaryReader.prototype={readByte:function(){var a=this._array[this._offset];this._offset++;return a},readWord:function(){return this.readByte()|(this.readByte()<<8)},readBool:function(){return this.readByte()!=0},readBuffer:function(c){var a=utils.makeUint8Array(c);for(var b=0;b<c;++b){a[b]=this.readByte()}return a}};utils.MemoryStream=function(a){this._array=a;this._offset=0;this._checksum8=0};utils.MemoryStream.prototype={write:function(a){this._array[this._offset++]=a;this._checksum8=((256+a-this._checksum8)&255)^255},clearChecksum8:function(){this._checksum8=0},writeChecksum8:function(){this.write(this._checksum8);this.clearChecksum8()},read:function(){if(this._offset>=this._array.length){return undefined}return this._array[this._offset++]}};function readbyte_internal(a){var b=nanowasp.z80cpu._memoryHandlers[a/nanowasp.z80cpu._memoryBlockSize|0];return b.handler.read(a-b.base)}function writebyte_internal(a,c){var b=nanowasp.z80cpu._memoryHandlers[a/nanowasp.z80cpu._memoryBlockSize|0];b.handler.write(a-b.base,c)}function readport(a){a&=255;var b=nanowasp.z80cpu._portHandlers[a/nanowasp.z80cpu._portBlockSize|0];return b.handler.read(a-b.base)}function writeport(a,c){a&=255;var b=nanowasp.z80cpu._portHandlers[a/nanowasp.z80cpu._portBlockSize|0];b.handler.write(a-b.base,c)}var nanowasp=nanowasp||{};nanowasp.Z80Cpu=function(){if(nanowasp.Z80Cpu.IsInstantiated){throw"Only supports one instance"}nanowasp.Z80Cpu.IsInstantiated=true;z80_init();var a={read:function(b){return 0},write:function(b,c){}};this._memoryBlockSize=this.MEMORY_SIZE;this._memoryHandlers=[{handler:a,base:0}];this._portBlockSize=this.PORT_SIZE;this._portHandlers=[{handler:a,base:0}]};nanowasp.Z80Cpu.IsInstantiated=false;nanowasp.Z80Cpu.prototype={FREQUENCY_HZ:3375000,MEMORY_SIZE:65536,PORT_SIZE:256,reset:function(){z80_reset()},restoreState:function(a){z80.f=a.readByte();z80.a=a.readByte();z80.c=a.readByte();z80.b=a.readByte();z80.e=a.readByte();z80.d=a.readByte();z80.l=a.readByte();z80.h=a.readByte();z80.ixl=a.readByte();z80.ixh=a.readByte();z80.iyl=a.readByte();z80.iyh=a.readByte();z80.sp=a.readWord();z80.f_=a.readByte();z80.a_=a.readByte();z80.c_=a.readByte();z80.b_=a.readByte();z80.e_=a.readByte();z80.d_=a.readByte();z80.l_=a.readByte();z80.h_=a.readByte();a.readWord();a.readWord();a.readWord();z80.pc=a.readWord();z80.r=a.readByte();z80.i=a.readByte();z80.iff1=a.readByte();z80.iff2=a.readByte();z80.im=a.readByte()},execute:function(b,a){tstates=0;event_next_event=a*this.FREQUENCY_HZ/1000000;z80_do_opcodes();return 0},getCurrentExecutionTime:function(){return tstates*1000000/this.FREQUENCY_HZ},setBreakpoint:function(a,b){z80_set_breakpoint(a,b)},clearBreakpoint:function(){z80_clear_breakpoint()},registerMemoryDevice:function(b,c){var a=this._registerDevice(b,c,this.MEMORY_SIZE,this._memoryBlockSize,this._memoryHandlers);this._memoryBlockSize=a.blockSize;this._memoryHandlers=a.handlers},registerPortDevice:function(b,c){var a=this._registerDevice(b,c,this.PORT_SIZE,this._portBlockSize,this._portHandlers);this._portBlockSize=a.blockSize;this._portHandlers=a.handlers},_registerDevice:function(n,q,d,k,c){var b=n;var e=b+q.getSize();var o=1;var h=1;if(e>d){throw"Handler doesn't fit in range"}while((b&o)==0&&o<d){o<<=1}while((e&h)==0&&h<d){h<<=1}var l=Math.min(o,h);if(l<k){var a=[];for(var g=0;g<c.length;++g){for(var f=0;f<k/l;++f){a.push(c[g])}}c=a;k=l}var m={handler:q,base:n};for(var g=b/k;g<e/k;++g){c[g]=m}return{blockSize:k,handlers:c}}};
/*!
 *   Virtual tape support based on TAP file idea in uBee512. 
 */
var nanowasp=nanowasp||{};nanowasp.VirtualTape=function(c,f,d,b,g,e,a){if(f.length>65535){throw {name:"ArgumentError",message:"'data' must be less than 64k in size."}}this.name=c;this.data=f;this.typeCode=d;this.startAddress=b;this.autoStartAddress=g;this.isAutoStart=e;this.extra=a};nanowasp.VirtualTape.createAutoTape=function(c,d){var a={default_:["B",2240,0,false,71],bee:["M",2304,2304,true,0],bin:["M",2304,2304,true,0],z80:["M",2304,2304,true,0],com:["M",256,256,true,0],asm:["S",4096,0,false,0],edt:["S",4096,0,false,0],mac:["S",4096,0,false,0],pas:["S",4096,0,false,0],txt:["S",4096,0,false,0],wbf:["W",2304,0,false,0]};var g=a.default_;var b=c.match(/\.(...)$/);if(b!=null){var f=b[1].toLowerCase();if(f in a){g=a[f]}}var e=g;return new nanowasp.VirtualTape(c,d,e[0],e[1],e[2],e[3],e[4])};nanowasp.VirtualTape.prototype={getFormattedData:function(){var h=40+1+16+1;var g=256;var d=Math.floor(this.data.length/g);var a=this.data.length%g;var b=d*(g+1);if(a>0){b+=a+1}var f=utils.makeUint8Array(h+b);var l=new utils.MemoryStream(f);for(var e=0;e<40;++e){l.write(0)}l.write(1);l.clearChecksum8();for(var e=0;e<6;++e){if(e<this.name.length){l.write(this.name.charCodeAt(e))}else{l.write(" ".charCodeAt(0))}}l.write(this.typeCode.charCodeAt(0));l.write(this.data.length&255);l.write(this.data.length>>8);l.write(this.startAddress&255);l.write(this.startAddress>>8);l.write(this.autoStartAddress&255);l.write(this.autoStartAddress>>8);l.write(0);if(this.isAutoStart){l.write(255)}else{l.write(0)}l.write(this.extra);l.writeChecksum8();var k=new utils.MemoryStream(this.data);for(var e=0;e<d;++e){for(var c=0;c<g;++c){l.write(k.read())}l.writeChecksum8()}if(a>0){for(var c=0;c<a;++c){l.write(k.read())}l.writeChecksum8()}return f}};
/*!
 *   Virtual tape support based on TAP file idea in uBee512. 
 */
var nanowasp=nanowasp||{};nanowasp.TapeInjector=function(a){this._z80cpu=a;this._data=[];this._offset=0};nanowasp.TapeInjector.prototype={LOCATION:43885,reset:function(){this._offset=0;this._z80cpu.setBreakpoint(this.LOCATION,utils.bind(this._readByte,this))},loadTape:function(a){this._data=a.getFormattedData();this._offset=0},_readByte:function(){var a=0;if(this._offset<this._data.length){a=this._data[this._offset];this._offset++}z80.a=a;z80_ret()}};var nanowasp=nanowasp||{};nanowasp.TapeView=function(b,c,a,d){this._tape=b;this._parentBlockElement=c;this._form=null;this._buildView(a,d)};nanowasp.TapeView.prototype={_buildView:function(a,c){var d=this;this._nameSpan=document.createElement("span");this._nameSpan.className="link";this._nameSpan.onclick=function(){a(d._tape)};this._nameSpan.appendChild(document.createTextNode(this._tape.name));var b=document.createElement("div");b.className="link right";b.onclick=function(){if(d._form==null){d._insertForm(c);b.innerHTML="done"}else{d._removeForm();b.innerHTML="edit"}};b.appendChild(document.createTextNode("edit"));this._parentBlockElement.appendChild(b);this._parentBlockElement.appendChild(this._nameSpan)},_insertForm:function(c){var d=this;var a=function(e){return"0x"+e.toString(16)};var b=function(e){d._nameSpan.innerHTML="";d._nameSpan.appendChild(document.createTextNode(e));return e};this._form=this._createForm(this._tape,[{property:"name",label:"Name",validator:b},{property:"typeCode",label:"Type code"},{property:"extra",label:"Spare byte",validator:this._integerValidator(0,255),renderer:a},{property:"startAddress",label:"Load address",validator:this._integerValidator(0,65535),renderer:a},{property:"autoStartAddress",label:"Start address",validator:this._integerValidator(0,65535),renderer:a},{property:"isAutoStart",label:"Auto started",type:"checkbox"}],2,function(){c(d._tape)});this._parentBlockElement.appendChild(this._form)},_removeForm:function(){if(this._form!=null){this._form.parentNode.removeChild(this._form);this._form=null}},_integerValidator:function(c,a){var b=function(f){var e=null;if(/^[0-9]+$/.test(f)){e=10}else{if(/^0x[0-9a-f]+$/i.test(f)){e=16}}if(e==null){return undefined}var d=parseInt(f,e);if(d>=c&&d<=a){return d}return undefined};b.message="Enter a number between "+c+" and "+a+".";return b},_createForm:function(h,a,e,b){var g=document.createElement("form");var f=typeof(e)!="undefined";var d=g;for(var c=0;c<a.length;++c){if(f&&c%e==0){var d=document.createElement("p");g.appendChild(d)}d.appendChild(this._createInput(h,a[c],b))}return g},_createInput:function(d,i,e){var h=i.type;if(h==undefined){h="text"}var f=document.createElement("input");f.type=h;var g=i.renderer;if(g==undefined){g=function(j){return j}}if(h=="checkbox"){f.checked=g(d[i.property])}else{f.value=g(d[i.property])}var a=i.validator;if(a==undefined){a=function(j){return j}}f.onchange=function(){var j;if(h=="checkbox"){j=a(f.checked)}else{j=a(f.value)}if(j!=undefined){d[i.property]=j;c.className="";e()}else{c.className="invalid"}};var c=document.createElement("label");var b=h!="checkbox";if(b){c.appendChild(document.createTextNode(i.label));c.appendChild(f)}else{c.appendChild(f);c.appendChild(document.createTextNode(i.label))}return c}};
/*!  NanoWasp - A MicroBee emulator
 *  Copyright (C) 2007, 2011 David G. Churchill
 *
 *  This file is part of NanoWasp.
 *
 *  NanoWasp 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 3 of the License, or
 *  (at your option) any later version.
 *
 *  NanoWasp 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, see <http://www.gnu.org/licenses/>.
 */
var nanowasp=nanowasp||{};nanowasp.Debugger=function(a){this._z80=z80;this._registersElement=document.getElementById(a)};nanowasp.Debugger.prototype={update:function(){utils.setTextContent(this._registersElement,"PC: "+this._formatHex(z80.pc,4)+"  SP: "+this._formatHex(z80.sp,4)+"\nAF: "+this._formatHex(z80.a,2)+this._formatHex(z80.f,2)+"  BC: "+this._formatHex(z80.b,2)+this._formatHex(z80.c,2)+"\nDE: "+this._formatHex(z80.d,2)+this._formatHex(z80.e,2)+"  HL: "+this._formatHex(z80.h,2)+this._formatHex(z80.l,2)+"\nIX: "+this._formatHex(z80.ixh,2)+this._formatHex(z80.ixl,2)+"  IY: "+this._formatHex(z80.iyh,2)+this._formatHex(z80.iyl,2)+"\n\n"+disassemble(z80.pc,5))},_formatHex:function(c,b){var a=c.toString(16).toUpperCase();while(a.length<b){a="0"+a}return a}};opcodes_ddcb={0:["LD B,RLC (IX+{})","dd"],1:["LD C,RLC (IX+{})","dd"],2:["LD D,RLC (IX+{})","dd"],3:["LD E,RLC (IX+{})","dd"],4:["LD H,RLC (IX+{})","dd"],5:["LD L,RLC (IX+{})","dd"],6:["RLC (IX+{})","dd"],7:["LD A,RLC (IX+{})","dd"],8:["LD B,RRC (IX+{})","dd"],9:["LD C,RRC (IX+{})","dd"],10:["LD D,RRC (IX+{})","dd"],11:["LD E,RRC (IX+{})","dd"],12:["LD H,RRC (IX+{})","dd"],13:["LD L,RRC (IX+{})","dd"],14:["RRC (IX+{})","dd"],15:["LD A,RRC (IX+{})","dd"],16:["LD B,RL (IX+{})","dd"],17:["LD C,RL (IX+{})","dd"],18:["LD D,RL (IX+{})","dd"],19:["LD E,RL (IX+{})","dd"],20:["LD H,RL (IX+{})","dd"],21:["LD L,RL (IX+{})","dd"],22:["RL (IX+{})","dd"],23:["LD A,RL (IX+{})","dd"],24:["LD B,RR (IX+{})","dd"],25:["LD C,RR (IX+{})","dd"],26:["LD D,RR (IX+{})","dd"],27:["LD E,RR (IX+{})","dd"],28:["LD H,RR (IX+{})","dd"],29:["LD L,RR (IX+{})","dd"],30:["RR (IX+{})","dd"],31:["LD A,RR (IX+{})","dd"],32:["LD B,SLA (IX+{})","dd"],33:["LD C,SLA (IX+{})","dd"],34:["LD D,SLA (IX+{})","dd"],35:["LD E,SLA (IX+{})","dd"],36:["LD H,SLA (IX+{})","dd"],37:["LD L,SLA (IX+{})","dd"],38:["SLA (IX+{})","dd"],39:["LD A,SLA (IX+{})","dd"],40:["LD B,SRA (IX+{})","dd"],41:["LD C,SRA (IX+{})","dd"],42:["LD D,SRA (IX+{})","dd"],43:["LD E,SRA (IX+{})","dd"],44:["LD H,SRA (IX+{})","dd"],45:["LD L,SRA (IX+{})","dd"],46:["SRA (IX+{})","dd"],47:["LD A,SRA (IX+{})","dd"],48:["LD B,SLL (IX+{})","dd"],49:["LD C,SLL (IX+{})","dd"],50:["LD D,SLL (IX+{})","dd"],51:["LD E,SLL (IX+{})","dd"],52:["LD H,SLL (IX+{})","dd"],53:["LD L,SLL (IX+{})","dd"],54:["SLL (IX+{})","dd"],55:["LD A,SLL (IX+{})","dd"],56:["LD B,SRL (IX+{})","dd"],57:["LD C,SRL (IX+{})","dd"],58:["LD D,SRL (IX+{})","dd"],59:["LD E,SRL (IX+{})","dd"],60:["LD H,SRL (IX+{})","dd"],61:["LD L,SRL (IX+{})","dd"],62:["SRL (IX+{})","dd"],63:["LD A,SRL (IX+{})","dd"],64:["BIT 0,(IX+{})","dd"],65:["BIT 0,(IX+{})","dd"],66:["BIT 0,(IX+{})","dd"],67:["BIT 0,(IX+{})","dd"],68:["BIT 0,(IX+{})","dd"],69:["BIT 0,(IX+{})","dd"],70:["BIT 0,(IX+{})","dd"],71:["BIT 0,(IX+{})","dd"],72:["BIT 1,(IX+{})","dd"],73:["BIT 1,(IX+{})","dd"],74:["BIT 1,(IX+{})","dd"],75:["BIT 1,(IX+{})","dd"],76:["BIT 1,(IX+{})","dd"],77:["BIT 1,(IX+{})","dd"],78:["BIT 1,(IX+{})","dd"],79:["BIT 1,(IX+{})","dd"],80:["BIT 2,(IX+{})","dd"],81:["BIT 2,(IX+{})","dd"],82:["BIT 2,(IX+{})","dd"],83:["BIT 2,(IX+{})","dd"],84:["BIT 2,(IX+{})","dd"],85:["BIT 2,(IX+{})","dd"],86:["BIT 2,(IX+{})","dd"],87:["BIT 2,(IX+{})","dd"],88:["BIT 3,(IX+{})","dd"],89:["BIT 3,(IX+{})","dd"],90:["BIT 3,(IX+{})","dd"],91:["BIT 3,(IX+{})","dd"],92:["BIT 3,(IX+{})","dd"],93:["BIT 3,(IX+{})","dd"],94:["BIT 3,(IX+{})","dd"],95:["BIT 3,(IX+{})","dd"],96:["BIT 4,(IX+{})","dd"],97:["BIT 4,(IX+{})","dd"],98:["BIT 4,(IX+{})","dd"],99:["BIT 4,(IX+{})","dd"],100:["BIT 4,(IX+{})","dd"],101:["BIT 4,(IX+{})","dd"],102:["BIT 4,(IX+{})","dd"],103:["BIT 4,(IX+{})","dd"],104:["BIT 5,(IX+{})","dd"],105:["BIT 5,(IX+{})","dd"],106:["BIT 5,(IX+{})","dd"],107:["BIT 5,(IX+{})","dd"],108:["BIT 5,(IX+{})","dd"],109:["BIT 5,(IX+{})","dd"],110:["BIT 5,(IX+{})","dd"],111:["BIT 5,(IX+{})","dd"],112:["BIT 6,(IX+{})","dd"],113:["BIT 6,(IX+{})","dd"],114:["BIT 6,(IX+{})","dd"],115:["BIT 6,(IX+{})","dd"],116:["BIT 6,(IX+{})","dd"],117:["BIT 6,(IX+{})","dd"],118:["BIT 6,(IX+{})","dd"],119:["BIT 6,(IX+{})","dd"],120:["BIT 7,(IX+{})","dd"],121:["BIT 7,(IX+{})","dd"],122:["BIT 7,(IX+{})","dd"],123:["BIT 7,(IX+{})","dd"],124:["BIT 7,(IX+{})","dd"],125:["BIT 7,(IX+{})","dd"],126:["BIT 7,(IX+{})","dd"],127:["BIT 7,(IX+{})","dd"],128:["LD B,RES 0,(IX+{})","dd"],129:["LD C,RES 0,(IX+{})","dd"],130:["LD D,RES 0,(IX+{})","dd"],131:["LD E,RES 0,(IX+{})","dd"],132:["LD H,RES 0,(IX+{})","dd"],133:["LD L,RES 0,(IX+{})","dd"],134:["RES 0,(IX+{})","dd"],135:["LD A,RES 0,(IX+{})","dd"],136:["LD B,RES 1,(IX+{})","dd"],137:["LD C,RES 1,(IX+{})","dd"],138:["LD D,RES 1,(IX+{})","dd"],139:["LD E,RES 1,(IX+{})","dd"],140:["LD H,RES 1,(IX+{})","dd"],141:["LD L,RES 1,(IX+{})","dd"],142:["RES 1,(IX+{})","dd"],143:["LD A,RES 1,(IX+{})","dd"],144:["LD B,RES 2,(IX+{})","dd"],145:["LD C,RES 2,(IX+{})","dd"],146:["LD D,RES 2,(IX+{})","dd"],147:["LD E,RES 2,(IX+{})","dd"],148:["LD H,RES 2,(IX+{})","dd"],149:["LD L,RES 2,(IX+{})","dd"],150:["RES 2,(IX+{})","dd"],151:["LD A,RES 2,(IX+{})","dd"],152:["LD B,RES 3,(IX+{})","dd"],153:["LD C,RES 3,(IX+{})","dd"],154:["LD D,RES 3,(IX+{})","dd"],155:["LD E,RES 3,(IX+{})","dd"],156:["LD H,RES 3,(IX+{})","dd"],157:["LD L,RES 3,(IX+{})","dd"],158:["RES 3,(IX+{})","dd"],159:["LD A,RES 3,(IX+{})","dd"],160:["LD B,RES 4,(IX+{})","dd"],161:["LD C,RES 4,(IX+{})","dd"],162:["LD D,RES 4,(IX+{})","dd"],163:["LD E,RES 4,(IX+{})","dd"],164:["LD H,RES 4,(IX+{})","dd"],165:["LD L,RES 4,(IX+{})","dd"],166:["RES 4,(IX+{})","dd"],167:["LD A,RES 4,(IX+{})","dd"],168:["LD B,RES 5,(IX+{})","dd"],169:["LD C,RES 5,(IX+{})","dd"],170:["LD D,RES 5,(IX+{})","dd"],171:["LD E,RES 5,(IX+{})","dd"],172:["LD H,RES 5,(IX+{})","dd"],173:["LD L,RES 5,(IX+{})","dd"],174:["RES 5,(IX+{})","dd"],175:["LD A,RES 5,(IX+{})","dd"],176:["LD B,RES 6,(IX+{})","dd"],177:["LD C,RES 6,(IX+{})","dd"],178:["LD D,RES 6,(IX+{})","dd"],179:["LD E,RES 6,(IX+{})","dd"],180:["LD H,RES 6,(IX+{})","dd"],181:["LD L,RES 6,(IX+{})","dd"],182:["RES 6,(IX+{})","dd"],183:["LD A,RES 6,(IX+{})","dd"],184:["LD B,RES 7,(IX+{})","dd"],185:["LD C,RES 7,(IX+{})","dd"],186:["LD D,RES 7,(IX+{})","dd"],187:["LD E,RES 7,(IX+{})","dd"],188:["LD H,RES 7,(IX+{})","dd"],189:["LD L,RES 7,(IX+{})","dd"],190:["RES 7,(IX+{})","dd"],191:["LD A,RES 7,(IX+{})","dd"],192:["LD B,SET 0,(IX+{})","dd"],193:["LD C,SET 0,(IX+{})","dd"],194:["LD D,SET 0,(IX+{})","dd"],195:["LD E,SET 0,(IX+{})","dd"],196:["LD H,SET 0,(IX+{})","dd"],197:["LD L,SET 0,(IX+{})","dd"],198:["SET 0,(IX+{})","dd"],199:["LD A,SET 0,(IX+{})","dd"],200:["LD B,SET 1,(IX+{})","dd"],201:["LD C,SET 1,(IX+{})","dd"],202:["LD D,SET 1,(IX+{})","dd"],203:["LD E,SET 1,(IX+{})","dd"],204:["LD H,SET 1,(IX+{})","dd"],205:["LD L,SET 1,(IX+{})","dd"],206:["SET 1,(IX+{})","dd"],207:["LD A,SET 1,(IX+{})","dd"],208:["LD B,SET 2,(IX+{})","dd"],209:["LD C,SET 2,(IX+{})","dd"],210:["LD D,SET 2,(IX+{})","dd"],211:["LD E,SET 2,(IX+{})","dd"],212:["LD H,SET 2,(IX+{})","dd"],213:["LD L,SET 2,(IX+{})","dd"],214:["SET 2,(IX+{})","dd"],215:["LD A,SET 2,(IX+{})","dd"],216:["LD B,SET 3,(IX+{})","dd"],217:["LD C,SET 3,(IX+{})","dd"],218:["LD D,SET 3,(IX+{})","dd"],219:["LD E,SET 3,(IX+{})","dd"],220:["LD H,SET 3,(IX+{})","dd"],221:["LD L,SET 3,(IX+{})","dd"],222:["SET 3,(IX+{})","dd"],223:["LD A,SET 3,(IX+{})","dd"],224:["LD B,SET 4,(IX+{})","dd"],225:["LD C,SET 4,(IX+{})","dd"],226:["LD D,SET 4,(IX+{})","dd"],227:["LD E,SET 4,(IX+{})","dd"],228:["LD H,SET 4,(IX+{})","dd"],229:["LD L,SET 4,(IX+{})","dd"],230:["SET 4,(IX+{})","dd"],231:["LD A,SET 4,(IX+{})","dd"],232:["LD B,SET 5,(IX+{})","dd"],233:["LD C,SET 5,(IX+{})","dd"],234:["LD D,SET 5,(IX+{})","dd"],235:["LD E,SET 5,(IX+{})","dd"],236:["LD H,SET 5,(IX+{})","dd"],237:["LD L,SET 5,(IX+{})","dd"],238:["SET 5,(IX+{})","dd"],239:["LD A,SET 5,(IX+{})","dd"],240:["LD B,SET 6,(IX+{})","dd"],241:["LD C,SET 6,(IX+{})","dd"],242:["LD D,SET 6,(IX+{})","dd"],243:["LD E,SET 6,(IX+{})","dd"],244:["LD H,SET 6,(IX+{})","dd"],245:["LD L,SET 6,(IX+{})","dd"],246:["SET 6,(IX+{})","dd"],247:["LD A,SET 6,(IX+{})","dd"],248:["LD B,SET 7,(IX+{})","dd"],249:["LD C,SET 7,(IX+{})","dd"],250:["LD D,SET 7,(IX+{})","dd"],251:["LD E,SET 7,(IX+{})","dd"],252:["LD H,SET 7,(IX+{})","dd"],253:["LD L,SET 7,(IX+{})","dd"],254:["SET 7,(IX+{})","dd"],255:["LD A,SET 7,(IX+{})","dd"]};opcodes_fdcb={0:["LD B,RLC (IY+{})","dd"],1:["LD C,RLC (IY+{})","dd"],2:["LD D,RLC (IY+{})","dd"],3:["LD E,RLC (IY+{})","dd"],4:["LD H,RLC (IY+{})","dd"],5:["LD L,RLC (IY+{})","dd"],6:["RLC (IY+{})","dd"],7:["LD A,RLC (IY+{})","dd"],8:["LD B,RRC (IY+{})","dd"],9:["LD C,RRC (IY+{})","dd"],10:["LD D,RRC (IY+{})","dd"],11:["LD E,RRC (IY+{})","dd"],12:["LD H,RRC (IY+{})","dd"],13:["LD L,RRC (IY+{})","dd"],14:["RRC (IY+{})","dd"],15:["LD A,RRC (IY+{})","dd"],16:["LD B,RL (IY+{})","dd"],17:["LD C,RL (IY+{})","dd"],18:["LD D,RL (IY+{})","dd"],19:["LD E,RL (IY+{})","dd"],20:["LD H,RL (IY+{})","dd"],21:["LD L,RL (IY+{})","dd"],22:["RL (IY+{})","dd"],23:["LD A,RL (IY+{})","dd"],24:["LD B,RR (IY+{})","dd"],25:["LD C,RR (IY+{})","dd"],26:["LD D,RR (IY+{})","dd"],27:["LD E,RR (IY+{})","dd"],28:["LD H,RR (IY+{})","dd"],29:["LD L,RR (IY+{})","dd"],30:["RR (IY+{})","dd"],31:["LD A,RR (IY+{})","dd"],32:["LD B,SLA (IY+{})","dd"],33:["LD C,SLA (IY+{})","dd"],34:["LD D,SLA (IY+{})","dd"],35:["LD E,SLA (IY+{})","dd"],36:["LD H,SLA (IY+{})","dd"],37:["LD L,SLA (IY+{})","dd"],38:["SLA (IY+{})","dd"],39:["LD A,SLA (IY+{})","dd"],40:["LD B,SRA (IY+{})","dd"],41:["LD C,SRA (IY+{})","dd"],42:["LD D,SRA (IY+{})","dd"],43:["LD E,SRA (IY+{})","dd"],44:["LD H,SRA (IY+{})","dd"],45:["LD L,SRA (IY+{})","dd"],46:["SRA (IY+{})","dd"],47:["LD A,SRA (IY+{})","dd"],48:["LD B,SLL (IY+{})","dd"],49:["LD C,SLL (IY+{})","dd"],50:["LD D,SLL (IY+{})","dd"],51:["LD E,SLL (IY+{})","dd"],52:["LD H,SLL (IY+{})","dd"],53:["LD L,SLL (IY+{})","dd"],54:["SLL (IY+{})","dd"],55:["LD A,SLL (IY+{})","dd"],56:["LD B,SRL (IY+{})","dd"],57:["LD C,SRL (IY+{})","dd"],58:["LD D,SRL (IY+{})","dd"],59:["LD E,SRL (IY+{})","dd"],60:["LD H,SRL (IY+{})","dd"],61:["LD L,SRL (IY+{})","dd"],62:["SRL (IY+{})","dd"],63:["LD A,SRL (IY+{})","dd"],64:["BIT 0,(IY+{})","dd"],65:["BIT 0,(IY+{})","dd"],66:["BIT 0,(IY+{})","dd"],67:["BIT 0,(IY+{})","dd"],68:["BIT 0,(IY+{})","dd"],69:["BIT 0,(IY+{})","dd"],70:["BIT 0,(IY+{})","dd"],71:["BIT 0,(IY+{})","dd"],72:["BIT 1,(IY+{})","dd"],73:["BIT 1,(IY+{})","dd"],74:["BIT 1,(IY+{})","dd"],75:["BIT 1,(IY+{})","dd"],76:["BIT 1,(IY+{})","dd"],77:["BIT 1,(IY+{})","dd"],78:["BIT 1,(IY+{})","dd"],79:["BIT 1,(IY+{})","dd"],80:["BIT 2,(IY+{})","dd"],81:["BIT 2,(IY+{})","dd"],82:["BIT 2,(IY+{})","dd"],83:["BIT 2,(IY+{})","dd"],84:["BIT 2,(IY+{})","dd"],85:["BIT 2,(IY+{})","dd"],86:["BIT 2,(IY+{})","dd"],87:["BIT 2,(IY+{})","dd"],88:["BIT 3,(IY+{})","dd"],89:["BIT 3,(IY+{})","dd"],90:["BIT 3,(IY+{})","dd"],91:["BIT 3,(IY+{})","dd"],92:["BIT 3,(IY+{})","dd"],93:["BIT 3,(IY+{})","dd"],94:["BIT 3,(IY+{})","dd"],95:["BIT 3,(IY+{})","dd"],96:["BIT 4,(IY+{})","dd"],97:["BIT 4,(IY+{})","dd"],98:["BIT 4,(IY+{})","dd"],99:["BIT 4,(IY+{})","dd"],100:["BIT 4,(IY+{})","dd"],101:["BIT 4,(IY+{})","dd"],102:["BIT 4,(IY+{})","dd"],103:["BIT 4,(IY+{})","dd"],104:["BIT 5,(IY+{})","dd"],105:["BIT 5,(IY+{})","dd"],106:["BIT 5,(IY+{})","dd"],107:["BIT 5,(IY+{})","dd"],108:["BIT 5,(IY+{})","dd"],109:["BIT 5,(IY+{})","dd"],110:["BIT 5,(IY+{})","dd"],111:["BIT 5,(IY+{})","dd"],112:["BIT 6,(IY+{})","dd"],113:["BIT 6,(IY+{})","dd"],114:["BIT 6,(IY+{})","dd"],115:["BIT 6,(IY+{})","dd"],116:["BIT 6,(IY+{})","dd"],117:["BIT 6,(IY+{})","dd"],118:["BIT 6,(IY+{})","dd"],119:["BIT 6,(IY+{})","dd"],120:["BIT 7,(IY+{})","dd"],121:["BIT 7,(IY+{})","dd"],122:["BIT 7,(IY+{})","dd"],123:["BIT 7,(IY+{})","dd"],124:["BIT 7,(IY+{})","dd"],125:["BIT 7,(IY+{})","dd"],126:["BIT 7,(IY+{})","dd"],127:["BIT 7,(IY+{})","dd"],128:["LD B,RES 0,(IY+{})","dd"],129:["LD C,RES 0,(IY+{})","dd"],130:["LD D,RES 0,(IY+{})","dd"],131:["LD E,RES 0,(IY+{})","dd"],132:["LD H,RES 0,(IY+{})","dd"],133:["LD L,RES 0,(IY+{})","dd"],134:["RES 0,(IY+{})","dd"],135:["LD A,RES 0,(IY+{})","dd"],136:["LD B,RES 1,(IY+{})","dd"],137:["LD C,RES 1,(IY+{})","dd"],138:["LD D,RES 1,(IY+{})","dd"],139:["LD E,RES 1,(IY+{})","dd"],140:["LD H,RES 1,(IY+{})","dd"],141:["LD L,RES 1,(IY+{})","dd"],142:["RES 1,(IY+{})","dd"],143:["LD A,RES 1,(IY+{})","dd"],144:["LD B,RES 2,(IY+{})","dd"],145:["LD C,RES 2,(IY+{})","dd"],146:["LD D,RES 2,(IY+{})","dd"],147:["LD E,RES 2,(IY+{})","dd"],148:["LD H,RES 2,(IY+{})","dd"],149:["LD L,RES 2,(IY+{})","dd"],150:["RES 2,(IY+{})","dd"],151:["LD A,RES 2,(IY+{})","dd"],152:["LD B,RES 3,(IY+{})","dd"],153:["LD C,RES 3,(IY+{})","dd"],154:["LD D,RES 3,(IY+{})","dd"],155:["LD E,RES 3,(IY+{})","dd"],156:["LD H,RES 3,(IY+{})","dd"],157:["LD L,RES 3,(IY+{})","dd"],158:["RES 3,(IY+{})","dd"],159:["LD A,RES 3,(IY+{})","dd"],160:["LD B,RES 4,(IY+{})","dd"],161:["LD C,RES 4,(IY+{})","dd"],162:["LD D,RES 4,(IY+{})","dd"],163:["LD E,RES 4,(IY+{})","dd"],164:["LD H,RES 4,(IY+{})","dd"],165:["LD L,RES 4,(IY+{})","dd"],166:["RES 4,(IY+{})","dd"],167:["LD A,RES 4,(IY+{})","dd"],168:["LD B,RES 5,(IY+{})","dd"],169:["LD C,RES 5,(IY+{})","dd"],170:["LD D,RES 5,(IY+{})","dd"],171:["LD E,RES 5,(IY+{})","dd"],172:["LD H,RES 5,(IY+{})","dd"],173:["LD L,RES 5,(IY+{})","dd"],174:["RES 5,(IY+{})","dd"],175:["LD A,RES 5,(IY+{})","dd"],176:["LD B,RES 6,(IY+{})","dd"],177:["LD C,RES 6,(IY+{})","dd"],178:["LD D,RES 6,(IY+{})","dd"],179:["LD E,RES 6,(IY+{})","dd"],180:["LD H,RES 6,(IY+{})","dd"],181:["LD L,RES 6,(IY+{})","dd"],182:["RES 6,(IY+{})","dd"],183:["LD A,RES 6,(IY+{})","dd"],184:["LD B,RES 7,(IY+{})","dd"],185:["LD C,RES 7,(IY+{})","dd"],186:["LD D,RES 7,(IY+{})","dd"],187:["LD E,RES 7,(IY+{})","dd"],188:["LD H,RES 7,(IY+{})","dd"],189:["LD L,RES 7,(IY+{})","dd"],190:["RES 7,(IY+{})","dd"],191:["LD A,RES 7,(IY+{})","dd"],192:["LD B,SET 0,(IY+{})","dd"],193:["LD C,SET 0,(IY+{})","dd"],194:["LD D,SET 0,(IY+{})","dd"],195:["LD E,SET 0,(IY+{})","dd"],196:["LD H,SET 0,(IY+{})","dd"],197:["LD L,SET 0,(IY+{})","dd"],198:["SET 0,(IY+{})","dd"],199:["LD A,SET 0,(IY+{})","dd"],200:["LD B,SET 1,(IY+{})","dd"],201:["LD C,SET 1,(IY+{})","dd"],202:["LD D,SET 1,(IY+{})","dd"],203:["LD E,SET 1,(IY+{})","dd"],204:["LD H,SET 1,(IY+{})","dd"],205:["LD L,SET 1,(IY+{})","dd"],206:["SET 1,(IY+{})","dd"],207:["LD A,SET 1,(IY+{})","dd"],208:["LD B,SET 2,(IY+{})","dd"],209:["LD C,SET 2,(IY+{})","dd"],210:["LD D,SET 2,(IY+{})","dd"],211:["LD E,SET 2,(IY+{})","dd"],212:["LD H,SET 2,(IY+{})","dd"],213:["LD L,SET 2,(IY+{})","dd"],214:["SET 2,(IY+{})","dd"],215:["LD A,SET 2,(IY+{})","dd"],216:["LD B,SET 3,(IY+{})","dd"],217:["LD C,SET 3,(IY+{})","dd"],218:["LD D,SET 3,(IY+{})","dd"],219:["LD E,SET 3,(IY+{})","dd"],220:["LD H,SET 3,(IY+{})","dd"],221:["LD L,SET 3,(IY+{})","dd"],222:["SET 3,(IY+{})","dd"],223:["LD A,SET 3,(IY+{})","dd"],224:["LD B,SET 4,(IY+{})","dd"],225:["LD C,SET 4,(IY+{})","dd"],226:["LD D,SET 4,(IY+{})","dd"],227:["LD E,SET 4,(IY+{})","dd"],228:["LD H,SET 4,(IY+{})","dd"],229:["LD L,SET 4,(IY+{})","dd"],230:["SET 4,(IY+{})","dd"],231:["LD A,SET 4,(IY+{})","dd"],232:["LD B,SET 5,(IY+{})","dd"],233:["LD C,SET 5,(IY+{})","dd"],234:["LD D,SET 5,(IY+{})","dd"],235:["LD E,SET 5,(IY+{})","dd"],236:["LD H,SET 5,(IY+{})","dd"],237:["LD L,SET 5,(IY+{})","dd"],238:["SET 5,(IY+{})","dd"],239:["LD A,SET 5,(IY+{})","dd"],240:["LD B,SET 6,(IY+{})","dd"],241:["LD C,SET 6,(IY+{})","dd"],242:["LD D,SET 6,(IY+{})","dd"],243:["LD E,SET 6,(IY+{})","dd"],244:["LD H,SET 6,(IY+{})","dd"],245:["LD L,SET 6,(IY+{})","dd"],246:["SET 6,(IY+{})","dd"],247:["LD A,SET 6,(IY+{})","dd"],248:["LD B,SET 7,(IY+{})","dd"],249:["LD C,SET 7,(IY+{})","dd"],250:["LD D,SET 7,(IY+{})","dd"],251:["LD E,SET 7,(IY+{})","dd"],252:["LD H,SET 7,(IY+{})","dd"],253:["LD L,SET 7,(IY+{})","dd"],254:["SET 7,(IY+{})","dd"],255:["LD A,SET 7,(IY+{})","dd"]};opcodes_cb={0:["RLC B",""],1:["RLC C",""],2:["RLC D",""],3:["RLC E",""],4:["RLC H",""],5:["RLC L",""],6:["RLC (HL)",""],7:["RLC A",""],8:["RRC B",""],9:["RRC C",""],10:["RRC D",""],11:["RRC E",""],12:["RRC H",""],13:["RRC L",""],14:["RRC (HL)",""],15:["RRC A",""],16:["RL B",""],17:["RL C",""],18:["RL D",""],19:["RL E",""],20:["RL H",""],21:["RL L",""],22:["RL (HL)",""],23:["RL A",""],24:["RR B",""],25:["RR C",""],26:["RR D",""],27:["RR E",""],28:["RR H",""],29:["RR L",""],30:["RR (HL)",""],31:["RR A",""],32:["SLA B",""],33:["SLA C",""],34:["SLA D",""],35:["SLA E",""],36:["SLA H",""],37:["SLA L",""],38:["SLA (HL)",""],39:["SLA A",""],40:["SRA B",""],41:["SRA C",""],42:["SRA D",""],43:["SRA E",""],44:["SRA H",""],45:["SRA L",""],46:["SRA (HL)",""],47:["SRA A",""],48:["SLL B",""],49:["SLL C",""],50:["SLL D",""],51:["SLL E",""],52:["SLL H",""],53:["SLL L",""],54:["SLL (HL)",""],55:["SLL A",""],56:["SRL B",""],57:["SRL C",""],58:["SRL D",""],59:["SRL E",""],60:["SRL H",""],61:["SRL L",""],62:["SRL (HL)",""],63:["SRL A",""],64:["BIT 0,B",""],65:["BIT 0,C",""],66:["BIT 0,D",""],67:["BIT 0,E",""],68:["BIT 0,H",""],69:["BIT 0,L",""],70:["BIT 0,(HL)",""],71:["BIT 0,A",""],72:["BIT 1,B",""],73:["BIT 1,C",""],74:["BIT 1,D",""],75:["BIT 1,E",""],76:["BIT 1,H",""],77:["BIT 1,L",""],78:["BIT 1,(HL)",""],79:["BIT 1,A",""],80:["BIT 2,B",""],81:["BIT 2,C",""],82:["BIT 2,D",""],83:["BIT 2,E",""],84:["BIT 2,H",""],85:["BIT 2,L",""],86:["BIT 2,(HL)",""],87:["BIT 2,A",""],88:["BIT 3,B",""],89:["BIT 3,C",""],90:["BIT 3,D",""],91:["BIT 3,E",""],92:["BIT 3,H",""],93:["BIT 3,L",""],94:["BIT 3,(HL)",""],95:["BIT 3,A",""],96:["BIT 4,B",""],97:["BIT 4,C",""],98:["BIT 4,D",""],99:["BIT 4,E",""],100:["BIT 4,H",""],101:["BIT 4,L",""],102:["BIT 4,(HL)",""],103:["BIT 4,A",""],104:["BIT 5,B",""],105:["BIT 5,C",""],106:["BIT 5,D",""],107:["BIT 5,E",""],108:["BIT 5,H",""],109:["BIT 5,L",""],110:["BIT 5,(HL)",""],111:["BIT 5,A",""],112:["BIT 6,B",""],113:["BIT 6,C",""],114:["BIT 6,D",""],115:["BIT 6,E",""],116:["BIT 6,H",""],117:["BIT 6,L",""],118:["BIT 6,(HL)",""],119:["BIT 6,A",""],120:["BIT 7,B",""],121:["BIT 7,C",""],122:["BIT 7,D",""],123:["BIT 7,E",""],124:["BIT 7,H",""],125:["BIT 7,L",""],126:["BIT 7,(HL)",""],127:["BIT 7,A",""],128:["RES 0,B",""],129:["RES 0,C",""],130:["RES 0,D",""],131:["RES 0,E",""],132:["RES 0,H",""],133:["RES 0,L",""],134:["RES 0,(HL)",""],135:["RES 0,A",""],136:["RES 1,B",""],137:["RES 1,C",""],138:["RES 1,D",""],139:["RES 1,E",""],140:["RES 1,H",""],141:["RES 1,L",""],142:["RES 1,(HL)",""],143:["RES 1,A",""],144:["RES 2,B",""],145:["RES 2,C",""],146:["RES 2,D",""],147:["RES 2,E",""],148:["RES 2,H",""],149:["RES 2,L",""],150:["RES 2,(HL)",""],151:["RES 2,A",""],152:["RES 3,B",""],153:["RES 3,C",""],154:["RES 3,D",""],155:["RES 3,E",""],156:["RES 3,H",""],157:["RES 3,L",""],158:["RES 3,(HL)",""],159:["RES 3,A",""],160:["RES 4,B",""],161:["RES 4,C",""],162:["RES 4,D",""],163:["RES 4,E",""],164:["RES 4,H",""],165:["RES 4,L",""],166:["RES 4,(HL)",""],167:["RES 4,A",""],168:["RES 5,B",""],169:["RES 5,C",""],170:["RES 5,D",""],171:["RES 5,E",""],172:["RES 5,H",""],173:["RES 5,L",""],174:["RES 5,(HL)",""],175:["RES 5,A",""],176:["RES 6,B",""],177:["RES 6,C",""],178:["RES 6,D",""],179:["RES 6,E",""],180:["RES 6,H",""],181:["RES 6,L",""],182:["RES 6,(HL)",""],183:["RES 6,A",""],184:["RES 7,B",""],185:["RES 7,C",""],186:["RES 7,D",""],187:["RES 7,E",""],188:["RES 7,H",""],189:["RES 7,L",""],190:["RES 7,(HL)",""],191:["RES 7,A",""],192:["SET 0,B",""],193:["SET 0,C",""],194:["SET 0,D",""],195:["SET 0,E",""],196:["SET 0,H",""],197:["SET 0,L",""],198:["SET 0,(HL)",""],199:["SET 0,A",""],200:["SET 1,B",""],201:["SET 1,C",""],202:["SET 1,D",""],203:["SET 1,E",""],204:["SET 1,H",""],205:["SET 1,L",""],206:["SET 1,(HL)",""],207:["SET 1,A",""],208:["SET 2,B",""],209:["SET 2,C",""],210:["SET 2,D",""],211:["SET 2,E",""],212:["SET 2,H",""],213:["SET 2,L",""],214:["SET 2,(HL)",""],215:["SET 2,A",""],216:["SET 3,B",""],217:["SET 3,C",""],218:["SET 3,D",""],219:["SET 3,E",""],220:["SET 3,H",""],221:["SET 3,L",""],222:["SET 3,(HL)",""],223:["SET 3,A",""],224:["SET 4,B",""],225:["SET 4,C",""],226:["SET 4,D",""],227:["SET 4,E",""],228:["SET 4,H",""],229:["SET 4,L",""],230:["SET 4,(HL)",""],231:["SET 4,A",""],232:["SET 5,B",""],233:["SET 5,C",""],234:["SET 5,D",""],235:["SET 5,E",""],236:["SET 5,H",""],237:["SET 5,L",""],238:["SET 5,(HL)",""],239:["SET 5,A",""],240:["SET 6,B",""],241:["SET 6,C",""],242:["SET 6,D",""],243:["SET 6,E",""],244:["SET 6,H",""],245:["SET 6,L",""],246:["SET 6,(HL)",""],247:["SET 6,A",""],248:["SET 7,B",""],249:["SET 7,C",""],250:["SET 7,D",""],251:["SET 7,E",""],252:["SET 7,H",""],253:["SET 7,L",""],254:["SET 7,(HL)",""],255:["SET 7,A",""]};opcodes_dd={9:["ADD IX,BC",""],25:["ADD IX,DE",""],33:["LD IX,{}","nnnn"],34:["LD ({}),IX","nnnn"],35:["INC IX",""],36:["INC IXH",""],37:["DEC IXH",""],38:["LD IXH,{}","nn"],41:["ADD IX,IX",""],42:["LD IX,({})","nnnn"],43:["DEC IX",""],44:["INC IXL",""],45:["DEC IXL",""],46:["LD IXL,{}","nn"],52:["INC (IX+{})","dd"],53:["DEC (IX+{})","dd"],54:["LD (IX+{}),nn","dd"],57:["ADD IX,SP",""],68:["LD B,IXH",""],69:["LD B,IXL",""],70:["LD B,(IX+{})","dd"],76:["LD C,IXH",""],77:["LD C,IXL",""],78:["LD C,(IX+{})","dd"],84:["LD D,IXH",""],85:["LD D,IXL",""],86:["LD D,(IX+{})","dd"],92:["LD E,IXH",""],93:["LD E,IXL",""],94:["LD E,(IX+{})","dd"],96:["LD IXH,B",""],97:["LD IXH,C",""],98:["LD IXH,D",""],99:["LD IXH,E",""],100:["LD IXH,IXH",""],101:["LD IXH,IXL",""],102:["LD H,(IX+{})","dd"],103:["LD IXH,A",""],104:["LD IXL,B",""],105:["LD IXL,C",""],106:["LD IXL,D",""],107:["LD IXL,E",""],108:["LD IXL,IXH",""],109:["LD IXL,IXL",""],110:["LD L,(IX+{})","dd"],111:["LD IXL,A",""],112:["LD (IX+{}),B","dd"],113:["LD (IX+{}),C","dd"],114:["LD (IX+{}),D","dd"],115:["LD (IX+{}),E","dd"],116:["LD (IX+{}),H","dd"],117:["LD (IX+{}),L","dd"],119:["LD (IX+{}),A","dd"],124:["LD A,IXH",""],125:["LD A,IXL",""],126:["LD A,(IX+{})","dd"],132:["ADD A,IXH",""],133:["ADD A,IXL",""],134:["ADD A,(IX+{})","dd"],140:["ADC A,IXH",""],141:["ADC A,IXL",""],142:["ADC A,(IX+{})","dd"],148:["SUB A,IXH",""],149:["SUB A,IXL",""],150:["SUB A,(IX+{})","dd"],156:["SBC A,IXH",""],157:["SBC A,IXL",""],158:["SBC A,(IX+{})","dd"],164:["AND A,IXH",""],165:["AND A,IXL",""],166:["AND A,(IX+{})","dd"],172:["XOR A,IXH",""],173:["XOR A,IXL",""],174:["XOR A,(IX+{})","dd"],180:["OR A,IXH",""],181:["OR A,IXL",""],182:["OR A,(IX+{})","dd"],188:["CP A,IXH",""],189:["CP A,IXL",""],190:["CP A,(IX+{})","dd"],203:opcodes_ddcb,225:["POP IX",""],227:["EX (SP),IX",""],229:["PUSH IX",""],233:["JP IX",""],249:["LD SP,IX",""]};opcodes_ed={64:["IN B,(C)",""],65:["OUT (C),B",""],66:["SBC HL,BC",""],67:["LD ({}),BC","nnnn"],68:["NEG",""],76:["NEG",""],84:["NEG",""],92:["NEG",""],100:["NEG",""],108:["NEG",""],116:["NEG",""],124:["NEG",""],69:["RETN",""],77:["RETN",""],85:["RETN",""],93:["RETN",""],101:["RETN",""],109:["RETN",""],117:["RETN",""],125:["RETN",""],70:["IM 0",""],78:["IM 0",""],102:["IM 0",""],110:["IM 0",""],71:["LD I,A",""],72:["IN C,(C)",""],73:["OUT (C),C",""],74:["ADC HL,BC",""],75:["LD BC,({})","nnnn"],79:["LD R,A",""],80:["IN D,(C)",""],81:["OUT (C),D",""],82:["SBC HL,DE",""],83:["LD ({}),DE","nnnn"],86:["IM 1",""],118:["IM 1",""],87:["LD A,I",""],88:["IN E,(C)",""],89:["OUT (C),E",""],90:["ADC HL,DE",""],91:["LD DE,({})","nnnn"],94:["IM 2",""],126:["IM 2",""],95:["LD A,R",""],96:["IN H,(C)",""],97:["OUT (C),H",""],98:["SBC HL,HL",""],99:["LD ({}),HL","nnnn"],103:["RRD",""],104:["IN L,(C)",""],105:["OUT (C),L",""],106:["ADC HL,HL",""],107:["LD HL,({})","nnnn"],111:["RLD",""],112:["IN F,(C)",""],113:["OUT (C),0",""],114:["SBC HL,SP",""],115:["LD ({}),SP","nnnn"],120:["IN A,(C)",""],121:["OUT (C),A",""],122:["ADC HL,SP",""],123:["LD SP,({})","nnnn"],160:["LDI",""],161:["CPI",""],162:["INI",""],163:["OUTI",""],168:["LDD",""],169:["CPD",""],170:["IND",""],171:["OUTD",""],176:["LDIR",""],177:["CPIR",""],178:["INIR",""],179:["OTIR",""],184:["LDDR",""],185:["CPDR",""],186:["INDR",""],187:["OTDR",""]};opcodes_fd={9:["ADD IY,BC",""],25:["ADD IY,DE",""],33:["LD IY,{}","nnnn"],34:["LD ({}),IY","nnnn"],35:["INC IY",""],36:["INC IYH",""],37:["DEC IYH",""],38:["LD IYH,{}","nn"],41:["ADD IY,IY",""],42:["LD IY,({})","nnnn"],43:["DEC IY",""],44:["INC IYL",""],45:["DEC IYL",""],46:["LD IYL,{}","nn"],52:["INC (IY+{})","dd"],53:["DEC (IY+{})","dd"],54:["LD (IY+{}),nn","dd"],57:["ADD IY,SP",""],68:["LD B,IYH",""],69:["LD B,IYL",""],70:["LD B,(IY+{})","dd"],76:["LD C,IYH",""],77:["LD C,IYL",""],78:["LD C,(IY+{})","dd"],84:["LD D,IYH",""],85:["LD D,IYL",""],86:["LD D,(IY+{})","dd"],92:["LD E,IYH",""],93:["LD E,IYL",""],94:["LD E,(IY+{})","dd"],96:["LD IYH,B",""],97:["LD IYH,C",""],98:["LD IYH,D",""],99:["LD IYH,E",""],100:["LD IYH,IYH",""],101:["LD IYH,IYL",""],102:["LD H,(IY+{})","dd"],103:["LD IYH,A",""],104:["LD IYL,B",""],105:["LD IYL,C",""],106:["LD IYL,D",""],107:["LD IYL,E",""],108:["LD IYL,IYH",""],109:["LD IYL,IYL",""],110:["LD L,(IY+{})","dd"],111:["LD IYL,A",""],112:["LD (IY+{}),B","dd"],113:["LD (IY+{}),C","dd"],114:["LD (IY+{}),D","dd"],115:["LD (IY+{}),E","dd"],116:["LD (IY+{}),H","dd"],117:["LD (IY+{}),L","dd"],119:["LD (IY+{}),A","dd"],124:["LD A,IYH",""],125:["LD A,IYL",""],126:["LD A,(IY+{})","dd"],132:["ADD A,IYH",""],133:["ADD A,IYL",""],134:["ADD A,(IY+{})","dd"],140:["ADC A,IYH",""],141:["ADC A,IYL",""],142:["ADC A,(IY+{})","dd"],148:["SUB A,IYH",""],149:["SUB A,IYL",""],150:["SUB A,(IY+{})","dd"],156:["SBC A,IYH",""],157:["SBC A,IYL",""],158:["SBC A,(IY+{})","dd"],164:["AND A,IYH",""],165:["AND A,IYL",""],166:["AND A,(IY+{})","dd"],172:["XOR A,IYH",""],173:["XOR A,IYL",""],174:["XOR A,(IY+{})","dd"],180:["OR A,IYH",""],181:["OR A,IYL",""],182:["OR A,(IY+{})","dd"],188:["CP A,IYH",""],189:["CP A,IYL",""],190:["CP A,(IY+{})","dd"],203:opcodes_fdcb,225:["POP IY",""],227:["EX (SP),IY",""],229:["PUSH IY",""],233:["JP IY",""],249:["LD SP,IY",""]};opcodes={0:["NOP",""],1:["LD BC,{}","nnnn"],2:["LD (BC),A",""],3:["INC BC",""],4:["INC B",""],5:["DEC B",""],6:["LD B,{}","nn"],7:["RLCA",""],8:["EX AF,AF'",""],9:["ADD HL,BC",""],10:["LD A,(BC)",""],11:["DEC BC",""],12:["INC C",""],13:["DEC C",""],14:["LD C,{}","nn"],15:["RRCA",""],16:["DJNZ {}","offset"],17:["LD DE,{}","nnnn"],18:["LD (DE),A",""],19:["INC DE",""],20:["INC D",""],21:["DEC D",""],22:["LD D,{}","nn"],23:["RLA",""],24:["JR {}","offset"],25:["ADD HL,DE",""],26:["LD A,(DE)",""],27:["DEC DE",""],28:["INC E",""],29:["DEC E",""],30:["LD E,{}","nn"],31:["RRA",""],32:["JR NZ,{}","offset"],33:["LD HL,{}","nnnn"],34:["LD ({}),HL","nnnn"],35:["INC HL",""],36:["INC H",""],37:["DEC H",""],38:["LD H,{}","nn"],39:["DAA",""],40:["JR Z,{}","offset"],41:["ADD HL,HL",""],42:["LD HL,({})","nnnn"],43:["DEC HL",""],44:["INC L",""],45:["DEC L",""],46:["LD L,{}","nn"],47:["CPL",""],48:["JR NC,{}","offset"],49:["LD SP,{}","nnnn"],50:["LD ({}),A","nnnn"],51:["INC SP",""],52:["INC (HL)",""],53:["DEC (HL)",""],54:["LD (HL),{}","nn"],55:["SCF",""],56:["JR C,{}","offset"],57:["ADD HL,SP",""],58:["LD A,({})","nnnn"],59:["DEC SP",""],60:["INC A",""],61:["DEC A",""],62:["LD A,{}","nn"],63:["CCF",""],64:["LD B,B",""],65:["LD B,C",""],66:["LD B,D",""],67:["LD B,E",""],68:["LD B,H",""],69:["LD B,L",""],70:["LD B,(HL)",""],71:["LD B,A",""],72:["LD C,B",""],73:["LD C,C",""],74:["LD C,D",""],75:["LD C,E",""],76:["LD C,H",""],77:["LD C,L",""],78:["LD C,(HL)",""],79:["LD C,A",""],80:["LD D,B",""],81:["LD D,C",""],82:["LD D,D",""],83:["LD D,E",""],84:["LD D,H",""],85:["LD D,L",""],86:["LD D,(HL)",""],87:["LD D,A",""],88:["LD E,B",""],89:["LD E,C",""],90:["LD E,D",""],91:["LD E,E",""],92:["LD E,H",""],93:["LD E,L",""],94:["LD E,(HL)",""],95:["LD E,A",""],96:["LD H,B",""],97:["LD H,C",""],98:["LD H,D",""],99:["LD H,E",""],100:["LD H,H",""],101:["LD H,L",""],102:["LD H,(HL)",""],103:["LD H,A",""],104:["LD L,B",""],105:["LD L,C",""],106:["LD L,D",""],107:["LD L,E",""],108:["LD L,H",""],109:["LD L,L",""],110:["LD L,(HL)",""],111:["LD L,A",""],112:["LD (HL),B",""],113:["LD (HL),C",""],114:["LD (HL),D",""],115:["LD (HL),E",""],116:["LD (HL),H",""],117:["LD (HL),L",""],118:["HALT",""],119:["LD (HL),A",""],120:["LD A,B",""],121:["LD A,C",""],122:["LD A,D",""],123:["LD A,E",""],124:["LD A,H",""],125:["LD A,L",""],126:["LD A,(HL)",""],127:["LD A,A",""],128:["ADD A,B",""],129:["ADD A,C",""],130:["ADD A,D",""],131:["ADD A,E",""],132:["ADD A,H",""],133:["ADD A,L",""],134:["ADD A,(HL)",""],135:["ADD A,A",""],136:["ADC A,B",""],137:["ADC A,C",""],138:["ADC A,D",""],139:["ADC A,E",""],140:["ADC A,H",""],141:["ADC A,L",""],142:["ADC A,(HL)",""],143:["ADC A,A",""],144:["SUB A,B",""],145:["SUB A,C",""],146:["SUB A,D",""],147:["SUB A,E",""],148:["SUB A,H",""],149:["SUB A,L",""],150:["SUB A,(HL)",""],151:["SUB A,A",""],152:["SBC A,B",""],153:["SBC A,C",""],154:["SBC A,D",""],155:["SBC A,E",""],156:["SBC A,H",""],157:["SBC A,L",""],158:["SBC A,(HL)",""],159:["SBC A,A",""],160:["AND A,B",""],161:["AND A,C",""],162:["AND A,D",""],163:["AND A,E",""],164:["AND A,H",""],165:["AND A,L",""],166:["AND A,(HL)",""],167:["AND A,A",""],168:["XOR A,B",""],169:["XOR A,C",""],170:["XOR A,D",""],171:["XOR A,E",""],172:["XOR A,H",""],173:["XOR A,L",""],174:["XOR A,(HL)",""],175:["XOR A,A",""],176:["OR A,B",""],177:["OR A,C",""],178:["OR A,D",""],179:["OR A,E",""],180:["OR A,H",""],181:["OR A,L",""],182:["OR A,(HL)",""],183:["OR A,A",""],184:["CP B",""],185:["CP C",""],186:["CP D",""],187:["CP E",""],188:["CP H",""],189:["CP L",""],190:["CP (HL)",""],191:["CP A",""],192:["RET NZ",""],193:["POP BC",""],194:["JP NZ,{}","nnnn"],195:["JP {}","nnnn"],196:["CALL NZ,{}","nnnn"],197:["PUSH BC",""],198:["ADD A,{}","nn"],199:["RST 00",""],200:["RET Z",""],201:["RET",""],202:["JP Z,{}","nnnn"],203:opcodes_cb,204:["CALL Z,{}","nnnn"],205:["CALL {}","nnnn"],206:["ADC A,{}","nn"],207:["RST 8",""],208:["RET NC",""],209:["POP DE",""],210:["JP NC,{}","nnnn"],211:["OUT ({}),A","nn"],212:["CALL NC,{}","nnnn"],213:["PUSH DE",""],214:["SUB {}","nn"],215:["RST 10",""],216:["RET C",""],217:["EXX",""],218:["JP C,{}","nnnn"],219:["IN A,({})","nn"],220:["CALL C,{}","nnnn"],221:opcodes_dd,222:["SBC A,{}","nn"],223:["RST 18",""],224:["RET PO",""],225:["POP HL",""],226:["JP PO,{}","nnnn"],227:["EX (SP),HL",""],228:["CALL PO,{}","nnnn"],229:["PUSH HL",""],230:["AND {}","nn"],231:["RST 20",""],232:["RET PE",""],233:["JP HL",""],234:["JP PE,{}","nnnn"],235:["EX DE,HL",""],236:["CALL PE,{}","nnnn"],237:opcodes_ed,238:["XOR A,{}","nn"],239:["RST 28",""],240:["RET P",""],241:["POP AF",""],242:["JP P,{}","nnnn"],243:["DI",""],244:["CALL P,{}","nnnn"],245:["PUSH AF",""],246:["OR {}","nn"],247:["RST 30",""],248:["RET M",""],249:["LD SP,HL",""],250:["JP M,{}","nnnn"],251:["EI",""],252:["CALL M,{}","nnnn"],253:opcodes_fd,254:["CP {}","nn"],255:["RST 38",""]};function hexString(c,b){var a=c.toString(16).toUpperCase();while(a.length<b){a="0"+a}return a+"h"}function disassemble(g,d){var j="";for(var b=0;b<d;++b){if(g>65530){return j}var h=opcodes;while(true){var a=readbyte_internal(g++);var f=h[a];if(f==undefined){return"unknown"}if(f.constructor!=Array){h=f;continue}var e=f[0];var c=f[1];switch(c){case"nn":case"dd":case"offset":c=hexString(readbyte_internal(g++),2);break;case"nnnn":c=hexString(readbyte_internal(g)+256*readbyte_internal(g+1),4);g+=2;break}j+=e.replace("{}",c)+"\n";break}}return j};
