minimal/docs/www/emulator/assets/js/libv86.min.js
2018-01-08 10:55:12 +02:00

18 lines
511 KiB
JavaScript

(function(){"use strict";function ScreenAdapter(e,t){function s(e){return e=e.toString(16),"#"+Array(7-e.length).join("0")+e}function r(e,t,s,r){e.style.width="",e.style.height="",r&&(e.style.transform=e.style.webkitTransform=e.style.MozTransform="");var _=e.getBoundingClientRect();r?e.style.transform=e.style.webkitTransform=e.style.MozTransform=(1===t?"":" scaleX("+t+")")+(1===s?"":" scaleY("+s+")"):(0==t%1&&0==s%1?(i.style.imageRendering="pixelated",i.style["-ms-interpolation-mode"]="nearest-neighbor"):(i.style.imageRendering="",i.style["-ms-interpolation-mode"]=""),0!=(r=window.devicePixelRatio||1)%1&&(t/=r,s/=r)),1!==t&&(e.style.width=_.width*t+"px"),1!==s&&(e.style.height=_.height*s+"px")}console.assert(e,"1st argument must be a DOM container");var i=e.getElementsByTagName("canvas")[0],_=i.getContext("2d"),a=e.getElementsByTagName("div")[0],o=document.createElement("div"),n,d,h,g,c=1,p=1,u,l,f=!1,m,b,y,v=this;e=new Uint16Array([199,252,233,226,228,224,229,231,234,235,232,239,238,236,196,197,201,230,198,244,246,242,251,249,255,214,220,162,163,165,8359,402,225,237,243,250,241,209,170,186,191,8976,172,189,188,161,171,187,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,945,223,915,960,931,963,181,964,934,920,937,948,8734,966,949,8745,8801,177,8805,8804,8992,8993,247,8776,176,8729,183,8730,8319,178,9632,160]);for(var P=new Uint16Array([32,9786,9787,9829,9830,9827,9824,8226,9688,9675,9689,9794,9792,9834,9835,9788,9658,9668,8597,8252,182,167,9644,8616,8593,8595,8594,8592,8735,8596,9650,9660]),w=[],S,E=0;256>E;E++)S=127<E?e[E-128]:32>E?P[E]:E,w[E]=String.fromCharCode(S);_.imageSmoothingEnabled=!1,o.style.position="absolute",o.style.backgroundColor="#ccc",o.style.width="7px",o.style.display="inline-block",a.style.display="block",i.style.display="none",this.bus=t,t.register("screen-set-mode",function(e){this.set_mode(e)},this),t.register("screen-fill-buffer-end",function(e){this.update_buffer(e[0],e[1])},this),t.register("screen-put-char",function(e){this.put_char(e[0],e[1],e[2],e[3],e[4])},this),t.register("screen-update-cursor",function(e){this.update_cursor(e[0],e[1])},this),t.register("screen-update-cursor-scanline",function(e){this.update_cursor_scanline(e[0],e[1])},this),t.register("screen-set-size-text",function(e){this.set_size_text(e[0],e[1])},this),t.register("screen-set-size-graphical",function(e){this.set_size_graphical(e[0],e[1])},this),this.init=function(){this.set_size_text(80,25),this.timer()},this.make_screenshot=function(){try{window.open(i.toDataURL())}catch(e){}},this.put_char=function(e,t,s,r,i){e<y&&t<b&&(t=3*(e*b+t),m[t]=s,m[t+1]=r,m[t+2]=i,l[e]=1)},this.timer=function(){requestAnimationFrame(f?x:I)};var I=function(){for(var e=0;e<y;e++)l[e]&&(v.text_update_row(e),l[e]=0);this.timer()}.bind(this),x=function(){this.bus.send("screen-fill-buffer"),this.timer()}.bind(this);this.destroy=function(){},this.set_mode=function(e){(f=e)?(a.style.display="none",i.style.display="block"):(a.style.display="block",i.style.display="none")},this.clear_screen=function(){_.fillStyle="#000",_.fillRect(0,0,i.width,i.height)},this.set_size_text=function(e,t){if(e!==b||t!==y){for(l=new Int8Array(t),m=new Int32Array(e*t*3),b=e,y=t;a.childNodes.length>t;)a.removeChild(a.firstChild);for(;a.childNodes.length<t;)a.appendChild(document.createElement("div"));for(e=0;e<t;e++)this.text_update_row(e);r(a,c,p,!0)}},this.set_size_graphical=function(e,t){i.style.display="block",i.width=e,i.height=t,n=_.createImageData(e,t),new Uint8Array(n.data.buffer),d=new Int32Array(n.data.buffer),u=e,this.bus.send("screen-tell-buffer",[d],[d.buffer]),r(i,c,p,!1)},this.set_scale=function(e,t){c=e,p=t,r(a,c,p,!0),r(i,c,p,!1)},this.set_scale(c,p),this.update_cursor_scanline=function(e,t){32&e?o.style.display="none":(o.style.display="inline",o.style.height=Math.min(15,t-e)+"px",o.style.marginTop=Math.min(15,e)+"px")},this.update_cursor=function(e,t){e===h&&t===g||(l[e]=1,l[h]=1,h=e,g=t)},this.text_update_row=function(e){for(var t=3*e*b,r,i=a.childNodes[e],_=document.createElement("div"),n=0;n<b;){var d=document.createElement("span"),c=m[t+1],p=m[t+2];for(d.style.backgroundColor=s(c),d.style.color=s(p),r="";n<b&&m[t+1]===c&&m[t+2]===p;)if(r+=w[m[t]],n++,t+=3,e===h){if(n===g)break;if(n===g+1){_.appendChild(o);break}}d.textContent=r,_.appendChild(d)}i.parentNode.replaceChild(_,i)},this.update_buffer=function(e,t){t<e||(e=e/u|0,_.putImageData(n,0,0,0,e,u,(t/u|0)-e+1))},this.init()}function Virtio9p(e,t){this.fs=e,this.bus=t,this.SendReply=function(e,t){},this.deviceid=9,this.hostfeature=1,this.configspace=new Uint8Array([6,0,104,111,115,116,57,112]),this.VERSION="9P2000.L",this.msize=this.BLOCKSIZE=8192,this.replybuffer=new Uint8Array(2*this.msize),this.replybuffersize=0,this.fids=[]}function IO(e){this.ports=[],this.cpu=e;for(var t=0;65536>t;t++)this.ports[t]=this.create_empty_entry();var s=e.memory_size;for(t=0;t<<MMAP_BLOCK_BITS<s;t++)e.memory_map_read8[t]=e.memory_map_write8[t]=void 0,e.memory_map_read32[t]=e.memory_map_write32[t]=void 0;this.mmap_register(s,4294967296-s,function(e){return dbg_log("Read from unmapped memory space, addr="+h(e>>>0,8),LOG_IO),255},function(e,t){dbg_log("Write to unmapped memory space, addr="+h(e>>>0,8)+" value="+h(t,2),LOG_IO)},function(e){return dbg_log("Read from unmapped memory space, addr="+h(e>>>0,8),LOG_IO),-1},function(e,t){dbg_log("Write to unmapped memory space, addr="+h(e>>>0,8)+" value="+h(t>>>0,8),LOG_IO)})}function v86(e){this.stopped=this.running=!1,this.cpu=new CPU(e),this.bus=e,e.register("cpu-init",this.init,this),e.register("cpu-run",this.run,this),e.register("cpu-stop",this.stop,this),e.register("cpu-restart",this.restart,this),this.register_tick()}function h(e,t){return e=e?e.toString(16):"","0x"+v86util.pad0(e.toUpperCase(),t||1)}function SyncBuffer(e){this.buffer=e,this.byteLength=e.byteLength,this.onprogress=this.onload=void 0}function ByteQueue(e){var t=new Uint8Array(e),s,r;dbg_assert(0==(e&e-1)),this.length=0,this.push=function(s){this.length!==e&&this.length++,t[r]=s,r=r+1&e-1},this.shift=function(){if(this.length){var r=t[s];return s=s+1&e-1,this.length--,r}return-1},this.peek=function(){return this.length?t[s]:-1},this.clear=function(){this.length=r=s=0},this.clear()}function FloatQueue(e){this.size=e,this.data=new Float32Array(e),this.length=this.end=this.start=0,dbg_assert(0==(e&e-1))}function CircularQueue(e){this.data=[],this.index=0,this.size=e}function FPU(e){this.cpu=e,this.st=new Float64Array(8),this.float32=new Float32Array(1),this.float32_byte=new Uint8Array(this.float32.buffer),this.float32_int=new Int32Array(this.float32.buffer),this.float64=new Float64Array(1),this.float64_byte=new Uint8Array(this.float64.buffer),this.float64_int=new Int32Array(this.float64.buffer),this.st8=new Uint8Array(this.st.buffer),this.st32=new Int32Array(this.st.buffer),this.stack_empty=255,this.stack_ptr=0,this.control_word=895,this.fpu_dp_selector=this.fpu_dp=this.fpu_opcode=this.fpu_ip_selector=this.fpu_ip=this.status_word=0,this.indefinite_nan=NaN,this.constants=new Float64Array([1,Math.log(10)/Math.LN2,Math.LOG2E,Math.PI,Math.log(2)/Math.LN10,Math.LN2,0])}function hex_dump(e,t){var s=[];t=t||e.byteLength;for(var r,i,_=0;_<t>>4;_++){r=h(_<<4,5)+" ";for(var a=0;16>a;a++)i=e[(_<<4)+a],r+=h(i,2)+" ";for(r+=" ",a=0;16>a;a++)i=e[(_<<4)+a],r+=33>i||126<i?".":String.fromCharCode(i);s.push(r)}return"\n"+s.join("\n")}function IDEDevice(e,t,s,r,i){this.master=new IDEInterface(this,e,t,s,r,0,i),this.slave=new IDEInterface(this,e,void 0,!1,r,1,i),this.current_interface=this.master,this.cpu=e,0===r?(this.ata_port=496,this.irq=14,this.pci_id=240):1===r?(this.ata_port=368,this.irq=15,this.pci_id=248):dbg_assert(!1,"IDE device with nr "+r+" ignored",LOG_DISK),this.ata_port_high=516|this.ata_port,this.master_port=46080,this.pci_space=[134,128,16,112,5,0,160,2,0,128,1,1,0,0,0,0,255&this.ata_port|1,this.ata_port>>8,0,0,255&this.ata_port_high|1,this.ata_port_high>>8,0,0,0,0,0,0,0,0,0,0,255&this.master_port|1,this.master_port>>8,0,0,0,0,0,0,0,0,0,0,67,16,212,130,0,0,0,0,0,0,0,0,0,0,0,0,this.irq,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],this.pci_bars=[{size:8},{size:4},void 0,void 0,{size:16}],this.name="ide"+r,this.device_control=2,e.io.register_read(7|this.ata_port,this,function(){return dbg_log("lower irq",LOG_DISK),this.cpu.device_lower_irq(this.irq),this.read_status()}),e.io.register_read(2|this.ata_port_high,this,this.read_status),e.io.register_write(2|this.ata_port_high,this,this.write_control),e.io.register_read(0|this.ata_port,this,function(){return this.current_interface.read_data(1)},function(){return this.current_interface.read_data(2)},function(){return this.current_interface.read_data(4)}),e.io.register_read(1|this.ata_port,this,function(){return dbg_log("Read error: "+h(255&this.current_interface.error)+" slave="+(this.current_interface===this.slave),LOG_DISK),this.current_interface.error}),e.io.register_read(2|this.ata_port,this,function(){return dbg_log("Read bytecount: "+h(255&this.current_interface.bytecount),LOG_DISK),255&this.current_interface.bytecount}),e.io.register_read(3|this.ata_port,this,function(){return dbg_log("Read sector: "+h(255&this.current_interface.sector),LOG_DISK),255&this.current_interface.sector}),e.io.register_read(4|this.ata_port,this,function(){return dbg_log("Read 1F4: "+h(255&this.current_interface.cylinder_low),LOG_DISK),255&this.current_interface.cylinder_low}),e.io.register_read(5|this.ata_port,this,function(){return dbg_log("Read 1F5: "+h(255&this.current_interface.cylinder_high),LOG_DISK),255&this.current_interface.cylinder_high}),e.io.register_read(6|this.ata_port,this,function(){return dbg_log("Read 1F6",LOG_DISK),this.current_interface.drive_head}),e.io.register_write(0|this.ata_port,this,function(e){this.current_interface.write_data_port8(e)},function(e){this.current_interface.write_data_port16(e)},function(e){this.current_interface.write_data_port32(e)}),e.io.register_write(1|this.ata_port,this,function(e){dbg_log("1F1/lba_count: "+h(e),LOG_DISK),this.master.lba_count=65535&(this.master.lba_count<<8|e),this.slave.lba_count=65535&(this.slave.lba_count<<8|e)}),e.io.register_write(2|this.ata_port,this,function(e){dbg_log("1F2/bytecount: "+h(e),LOG_DISK),this.master.bytecount=65535&(this.master.bytecount<<8|e),this.slave.bytecount=65535&(this.slave.bytecount<<8|e)}),e.io.register_write(3|this.ata_port,this,function(e){dbg_log("1F3/sector: "+h(e),LOG_DISK),this.master.sector=65535&(this.master.sector<<8|e),this.slave.sector=65535&(this.slave.sector<<8|e)}),e.io.register_write(4|this.ata_port,this,function(e){dbg_log("1F4/sector low: "+h(e),LOG_DISK),this.master.cylinder_low=65535&(this.master.cylinder_low<<8|e),this.slave.cylinder_low=65535&(this.slave.cylinder_low<<8|e)}),e.io.register_write(5|this.ata_port,this,function(e){dbg_log("1F5/sector high: "+h(e),LOG_DISK),this.master.cylinder_high=65535&(this.master.cylinder_high<<8|e),this.slave.cylinder_high=65535&(this.slave.cylinder_high<<8|e)}),e.io.register_write(6|this.ata_port,this,function(e){var t=16&e;dbg_log("1F6/drive: "+h(e,2),LOG_DISK),t?(dbg_log("Slave",LOG_DISK),this.current_interface=this.slave):this.current_interface=this.master,this.master.drive_head=e,this.slave.drive_head=e,this.master.is_lba=this.slave.is_lba=e>>6&1,this.master.head=this.slave.head=15&e}),this.dma_command=this.dma_status=this.prdt_addr=0,e.io.register_write(7|this.ata_port,this,function(e){dbg_log("lower irq",LOG_DISK),this.cpu.device_lower_irq(this.irq),this.current_interface.ata_command(e)}),e.io.register_read(4|this.master_port,this,void 0,void 0,this.dma_read_addr),e.io.register_write(4|this.master_port,this,void 0,void 0,this.dma_set_addr),e.io.register_read(this.master_port,this,this.dma_read_command8,void 0,this.dma_read_command),e.io.register_write(this.master_port,this,this.dma_write_command8,void 0,this.dma_write_command),e.io.register_read(2|this.master_port,this,this.dma_read_status),e.io.register_write(2|this.master_port,this,this.dma_write_status),e.io.register_read(8|this.master_port,this,function(){return dbg_log("DMA read 0x8",LOG_DISK),0}),e.io.register_read(10|this.master_port,this,function(){return dbg_log("DMA read 0xA",LOG_DISK),0}),e.devices.pci.register_device(this),DEBUG&&Object.seal(this)}function IDEInterface(e,t,s,r,i,_,a){this.device=e,this.bus=a,this.nr=i,this.cpu=t,this.buffer=s,this.sector_size=r?CDROM_SECTOR_SIZE:HD_SECTOR_SIZE,this.is_atapi=r,this.cylinder_count=this.sectors_per_track=this.head_count=this.sector_count=0,this.buffer&&(this.sector_count=this.buffer.byteLength/this.sector_size,this.sector_count!==(0|this.sector_count)&&(dbg_log("Warning: Disk size not aligned with sector size",LOG_DISK),this.sector_count=Math.ceil(this.sector_count)),r?(this.head_count=1,this.sectors_per_track=0):(this.head_count=16,this.sectors_per_track=63),this.cylinder_count=this.sector_count/this.head_count/this.sectors_per_track,this.cylinder_count!==(0|this.cylinder_count)&&(dbg_log("Warning: Rounding up cylinder count. Choose different head number",LOG_DISK),this.cylinder_count=Math.floor(this.cylinder_count)),e=t.devices.rtc,e.cmos_write(CMOS_BIOS_DISKTRANSFLAG,e.cmos_read(CMOS_BIOS_DISKTRANSFLAG)|1<<4*this.nr),e.cmos_write(CMOS_DISK_DATA,15&e.cmos_read(CMOS_DISK_DATA)|240),t=CMOS_DISK_DRIVE1_CYL,e.cmos_write(t+0,255&this.cylinder_count),e.cmos_write(t+1,this.cylinder_count>>8&255),e.cmos_write(t+2,255&this.head_count),e.cmos_write(t+3,255),e.cmos_write(t+4,255),e.cmos_write(t+5,200),e.cmos_write(t+6,255&this.cylinder_count),e.cmos_write(t+7,this.cylinder_count>>8&255),e.cmos_write(t+8,255&this.sectors_per_track)),this.stats={sectors_read:0,sectors_written:0,bytes_read:0,bytes_written:0,loading:!1},this.buffer=s,this.drive_head=this.head=this.cylinder_high=this.cylinder_low=this.lba_count=this.sector=this.bytecount=this.is_lba=0,this.status=80,this.sectors_per_drq=128,this.data_pointer=this.error=0,this.data=new Uint8Array(65536),this.data16=new Uint16Array(this.data.buffer),this.data32=new Int32Array(this.data.buffer),this.data_end=this.data_length=0,this.current_atapi_command=this.current_command=-1,this.write_dest=0,Object.seal(this)}function PCI(e){this.pci_addr=new Uint8Array(4),this.pci_value=new Uint8Array(4),this.pci_response=new Uint8Array(4),this.pci_status=new Uint8Array(4),this.pci_addr32=new Int32Array(this.pci_addr.buffer),this.pci_value32=new Int32Array(this.pci_value.buffer),this.pci_response32=new Int32Array(this.pci_response.buffer),this.pci_status32=new Int32Array(this.pci_status.buffer),this.device_spaces=[],this.devices=[],this.cpu=e;for(var t=0;256>t;t++)this.device_spaces[t]=void 0,this.devices[t]=void 0;this.io=e.io,e.io.register_write(PCI_CONFIG_DATA,this,function(e){this.pci_write8(this.pci_addr32[0],e)},function(e){this.pci_write16(this.pci_addr32[0],e)},function(e){this.pci_write32(this.pci_addr32[0],e)}),e.io.register_write(PCI_CONFIG_DATA+1,this,function(e){this.pci_write8(this.pci_addr32[0]+1|0,e)}),e.io.register_write(PCI_CONFIG_DATA+2,this,function(e){this.pci_write8(this.pci_addr32[0]+2|0,e)},function(e){this.pci_write16(this.pci_addr32[0]+2|0,e)}),e.io.register_write(PCI_CONFIG_DATA+3,this,function(e){this.pci_write8(this.pci_addr32[0]+3|0,e)}),e.io.register_read_consecutive(PCI_CONFIG_DATA,this,function(){return this.pci_response[0]},function(){return this.pci_response[1]},function(){return this.pci_response[2]},function(){return this.pci_response[3]}),e.io.register_read_consecutive(PCI_CONFIG_ADDRESS,this,function(){return this.pci_status[0]},function(){return this.pci_status[1]},function(){return this.pci_status[2]},function(){return this.pci_status[3]}),e.io.register_write_consecutive(PCI_CONFIG_ADDRESS,this,function(e){this.pci_addr[0]=252&e},function(e){this.pci_addr[1]=e},function(e){this.pci_addr[2]=e},function(e){this.pci_addr[3]=e,this.pci_query()}),this.register_device({pci_id:0,pci_space:[134,128,55,18,0,0,0,0,2,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],pci_bars:[],name:"82441FX PMC"}),this.isa_bridge={pci_id:8,pci_space:[134,128,0,112,7,0,0,2,0,0,1,6,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],pci_bars:[],name:"82371SB PIIX3 ISA"},this.isa_bridge_space=this.register_device(this.isa_bridge),this.isa_bridge_space8=new Uint8Array(this.isa_bridge_space.buffer)}function FloppyController(e,t,s){if(this.io=e.io,this.cpu=e,this.dma=e.devices.dma,this.bytes_expecting=0,this.receiving_command=new Uint8Array(10),this.receiving_index=0,this.next_command=null,this.response_data=new Uint8Array(10),this.floppy_size=this.response_length=this.response_index=0,this.fda_image=t,this.fdb_image=s,this.last_head=this.last_cylinder=this.drive=this.status_reg2=this.status_reg1=this.status_reg0=0,this.last_sector=1,this.dor=0,t){if(this.floppy_size=t.byteLength,!(s={160:{type:1,tracks:40,sectors:8,heads:1},180:{type:1,tracks:40,sectors:9,heads:1},200:{type:1,tracks:40,sectors:10,heads:1},320:{type:1,tracks:40,sectors:8,heads:2},360:{type:1,tracks:40,sectors:9,heads:2},400:{type:1,tracks:40,sectors:10,heads:2},720:{type:3,tracks:80,sectors:9,heads:2},1200:{type:2,tracks:80,sectors:15,heads:2},1440:{type:4,tracks:80,sectors:18,heads:2},1722:{type:5,tracks:82,sectors:21,heads:2},2880:{type:5,tracks:80,sectors:36,heads:2}}[this.floppy_size>>10])||0!=(1023&this.floppy_size))throw"Unknown floppy size: "+h(t.byteLength);e.devices.rtc.cmos_write(CMOS_FLOPPY_DRIVE_TYPE,s.type<<4),e=s.sectors,t=s.heads,s=s.tracks,this.sectors_per_track=e,this.number_of_heads=t,this.number_of_cylinders=s}else e.devices.rtc.cmos_write(CMOS_FLOPPY_DRIVE_TYPE,64),this.floppy_size=this.number_of_cylinders=this.number_of_heads=this.sectors_per_track=0;this.io.register_read(1008,this,this.port3F0_read),this.io.register_read(1010,this,this.port3F2_read),this.io.register_read(1012,this,this.port3F4_read),this.io.register_read(1013,this,this.port3F5_read),this.io.register_read(1015,this,this.port3F7_read),this.io.register_write(1010,this,this.port3F2_write),this.io.register_write(1013,this,this.port3F5_write)}function DMA(e){this.cpu=e,this.channel_page=new Uint8Array(8),this.channel_pagehi=new Uint8Array(8),this.channel_addr=new Uint16Array(8),this.channel_addr_init=new Uint16Array(8),this.channel_count=new Uint16Array(8),this.channel_count_init=new Uint16Array(8),this.channel_mask=new Uint8Array(8),this.channel_mode=new Uint8Array(8),this.unmask_listeners=[],this.lsb_msb_flipflop=0,e=e.io,e.register_write(0,this,this.port_addr_write.bind(this,0)),e.register_write(2,this,this.port_addr_write.bind(this,1)),e.register_write(4,this,this.port_addr_write.bind(this,2)),e.register_write(6,this,this.port_addr_write.bind(this,3)),e.register_write(1,this,this.port_count_write.bind(this,0)),e.register_write(3,this,this.port_count_write.bind(this,1)),e.register_write(5,this,this.port_count_write.bind(this,2)),e.register_write(7,this,this.port_count_write.bind(this,3)),e.register_read(0,this,this.port_addr_read.bind(this,0)),e.register_read(2,this,this.port_addr_read.bind(this,1)),e.register_read(4,this,this.port_addr_read.bind(this,2)),e.register_read(6,this,this.port_addr_read.bind(this,3)),e.register_read(1,this,this.port_count_read.bind(this,0)),e.register_read(3,this,this.port_count_read.bind(this,1)),e.register_read(5,this,this.port_count_read.bind(this,2)),e.register_read(7,this,this.port_count_read.bind(this,3)),e.register_write(192,this,this.port_addr_write.bind(this,4)),e.register_write(196,this,this.port_addr_write.bind(this,5)),e.register_write(200,this,this.port_addr_write.bind(this,6)),e.register_write(204,this,this.port_addr_write.bind(this,7)),e.register_write(194,this,this.port_count_write.bind(this,4)),e.register_write(198,this,this.port_count_write.bind(this,5)),e.register_write(202,this,this.port_count_write.bind(this,6)),e.register_write(206,this,this.port_count_write.bind(this,7)),e.register_read(192,this,this.port_addr_read.bind(this,4)),e.register_read(196,this,this.port_addr_read.bind(this,5)),e.register_read(200,this,this.port_addr_read.bind(this,6)),e.register_read(204,this,this.port_addr_read.bind(this,7)),e.register_read(194,this,this.port_count_read.bind(this,4)),e.register_read(198,this,this.port_count_read.bind(this,5)),e.register_read(202,this,this.port_count_read.bind(this,6)),e.register_read(206,this,this.port_count_read.bind(this,7)),e.register_write(135,this,this.port_page_write.bind(this,0)),e.register_write(131,this,this.port_page_write.bind(this,1)),e.register_write(129,this,this.port_page_write.bind(this,2)),e.register_write(130,this,this.port_page_write.bind(this,3)),e.register_write(143,this,this.port_page_write.bind(this,4)),e.register_write(139,this,this.port_page_write.bind(this,5)),e.register_write(137,this,this.port_page_write.bind(this,6)),e.register_write(138,this,this.port_page_write.bind(this,7)),e.register_read(135,this,this.port_page_read.bind(this,0)),e.register_read(131,this,this.port_page_read.bind(this,1)),e.register_read(129,this,this.port_page_read.bind(this,2)),e.register_read(130,this,this.port_page_read.bind(this,3)),e.register_read(143,this,this.port_page_read.bind(this,4)),e.register_read(139,this,this.port_page_read.bind(this,5)),e.register_read(137,this,this.port_page_read.bind(this,6)),e.register_read(138,this,this.port_page_read.bind(this,7)),e.register_write(1159,this,this.port_pagehi_write.bind(this,0)),e.register_write(1155,this,this.port_pagehi_write.bind(this,1)),e.register_write(1153,this,this.port_pagehi_write.bind(this,2)),e.register_write(1154,this,this.port_pagehi_write.bind(this,3)),e.register_write(1163,this,this.port_pagehi_write.bind(this,5)),e.register_write(1161,this,this.port_pagehi_write.bind(this,6)),e.register_write(1162,this,this.port_pagehi_write.bind(this,7)),e.register_read(1159,this,this.port_pagehi_read.bind(this,0)),e.register_read(1155,this,this.port_pagehi_read.bind(this,1)),e.register_read(1153,this,this.port_pagehi_read.bind(this,2)),e.register_read(1154,this,this.port_pagehi_read.bind(this,3)),e.register_read(1163,this,this.port_pagehi_read.bind(this,5)),e.register_read(1161,this,this.port_pagehi_read.bind(this,6)),e.register_read(1162,this,this.port_pagehi_read.bind(this,7)),e.register_write(10,this,this.port_singlemask_write.bind(this,0)),e.register_write(212,this,this.port_singlemask_write.bind(this,4)),e.register_write(15,this,this.port_multimask_write.bind(this,0)),e.register_write(222,this,this.port_multimask_write.bind(this,4)),e.register_read(15,this,this.port_multimask_read.bind(this,0)),e.register_read(222,this,this.port_multimask_read.bind(this,4)),e.register_write(11,this,this.port_mode_write.bind(this,0)),e.register_write(214,this,this.port_mode_write.bind(this,4)),e.register_write(12,this,this.portC_write),e.register_write(216,this,this.portC_write)}function PIT(e,t){this.cpu=e,this.bus=t,this.counter_start_time=new Float64Array(3),this.counter_start_value=new Uint16Array(3),this.counter_next_low=new Uint8Array(4),this.counter_enabled=new Uint8Array(4),this.counter_mode=new Uint8Array(4),this.counter_read_mode=new Uint8Array(4),this.counter_latch=new Uint8Array(4),this.counter_latch_value=new Uint16Array(3),this.counter_reload=new Uint16Array(3),e.io.register_read(97,this,function(){var e=v86.microtick(),t=66.66666666666667*e&1;return e=this.did_rollover(2,e),t<<4|e<<5}),e.io.register_write(97,this,function(e){this.bus.send("pcspeaker-enable",1&e)}),e.io.register_read(64,this,function(){return this.counter_read(0)}),e.io.register_read(65,this,function(){return this.counter_read(1)}),e.io.register_read(66,this,function(){return this.counter_read(2)}),e.io.register_write(64,this,function(e){this.counter_write(0,e)}),e.io.register_write(65,this,function(e){this.counter_write(1,e)}),e.io.register_write(66,this,function(e){this.counter_write(2,e)}),e.io.register_write(67,this,this.port43_write)}function VGAScreen(e,t,s){this.bus=t,this.vga_memory_size=s,this.cursor_address=0,this.cursor_scanline_start=14,this.cursor_scanline_end=15,this.max_cols=80,this.max_rows=25,this.start_address=this.screen_height=this.screen_width=0,this.crtc=new Uint8Array(25),this.previous_start_address=0,this.graphical_mode_is_linear=!0,this.graphical_mode=!1,this.vga256_palette=new Int32Array(256),this.svga_height=this.svga_width=this.latch3=this.latch2=this.latch1=this.latch0=0,this.text_mode_width=80,this.svga_enabled=!1,this.svga_bpp=32,this.svga_offset=this.svga_bank_offset=0,this.pci_space=[222,16,32,10,7,0,0,0,162,0,0,3,0,0,128,0,8,VGA_LFB_ADDRESS>>>8,VGA_LFB_ADDRESS>>>16,VGA_LFB_ADDRESS>>>24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,1,0,0],this.pci_id=144,this.pci_bars=[{size:s}],this.pci_rom_size=65536,this.pci_rom_address=4272947200,this.name="vga",this.stats={is_graphical:!1,res_x:0,res_y:0,bpp:0},this.dac_color_index_read=this.dac_color_index_write=this.offset_register=this.index_crtc=0,this.attribute_controller_index=-1,this.dac_map=new Uint8Array(16),this.sequencer_index=-1,this.plane_write_bm=15,this.sequencer_memory_mode=0,this.graphics_index=-1,this.planar_rotate_reg=this.planar_mode=this.plane_read=0,this.planar_bitmap=255,this.max_scan_line=0,this.port_3DA_value=this.miscellaneous_output_register=255,s=e.io,s.register_write(960,this,this.port3C0_write),s.register_read(960,this,this.port3C0_read,this.port3C0_read16),s.register_read(961,this,this.port3C1_read),s.register_write(962,this,this.port3C2_write),s.register_write_consecutive(964,this,this.port3C4_write,this.port3C5_write),s.register_read(964,this,this.port3C4_read),s.register_read(965,this,this.port3C5_read),s.register_write_consecutive(974,this,this.port3CE_write,this.port3CF_write),s.register_read(974,this,this.port3CE_read),s.register_read(975,this,this.port3CF_read),s.register_write(967,this,this.port3C7_write),s.register_write(968,this,this.port3C8_write),s.register_write(969,this,this.port3C9_write),s.register_read(969,this,this.port3C9_read),s.register_read(972,this,this.port3CC_read),s.register_write_consecutive(980,this,this.port3D4_write,this.port3D5_write),s.register_read(981,this,this.port3D5_read),s.register_read(980,this,function(){return dbg_log("3D4 read",LOG_VGA),0}),s.register_read(970,this,function(){return dbg_log("3CA read",LOG_VGA),0}),s.register_read(986,this,this.port3DA_read),this.dispi_index=-1,this.dispi_enable_value=0,s.register_write(462,this,void 0,this.port1CE_write),s.register_write(463,this,void 0,this.port1CF_write),s.register_read(463,this,void 0,this.port1CF_read),void 0===this.vga_memory_size||this.vga_memory_size<4*VGA_BANK_SIZE?(this.vga_memory_size=4*VGA_BANK_SIZE,dbg_log("vga memory size rounded up to "+this.vga_memory_size,LOG_VGA)):this.vga_memory_size&VGA_BANK_SIZE-1&&(this.vga_memory_size|=VGA_BANK_SIZE-1,this.vga_memory_size++),this.svga_memory=new Uint8Array(this.vga_memory_size),this.diff_addr_min=this.vga_memory_size,this.diff_addr_max=0,this.dest_buffer=void 0,t.register("screen-tell-buffer",function(e){this.dest_buffer=e[0]},this),t.register("screen-fill-buffer",function(){this.screen_fill_buffer()},this),this.svga_memory16=new Uint16Array(this.svga_memory.buffer),this.svga_memory32=new Int32Array(this.svga_memory.buffer),this.vga_memory=new Uint8Array(this.svga_memory.buffer,0,4*VGA_BANK_SIZE),this.plane0=new Uint8Array(this.svga_memory.buffer,0*VGA_BANK_SIZE,VGA_BANK_SIZE),this.plane1=new Uint8Array(this.svga_memory.buffer,1*VGA_BANK_SIZE,VGA_BANK_SIZE),this.plane2=new Uint8Array(this.svga_memory.buffer,2*VGA_BANK_SIZE,VGA_BANK_SIZE),this.plane3=new Uint8Array(this.svga_memory.buffer,3*VGA_BANK_SIZE,VGA_BANK_SIZE);var r=this;s.mmap_register(655360,131072,function(e){return r.vga_memory_read(e)},function(e,t){r.vga_memory_write(e,t)}),s.mmap_register(VGA_LFB_ADDRESS,this.vga_memory_size,function(e){return r.svga_memory_read8(e)},function(e,t){r.svga_memory_write8(e,t)},function(e){return r.svga_memory_read32(e)},function(e,t){r.svga_memory_write32(e,t)}),e.devices.pci.register_device(this)}function PS2(e,t){this.cpu=e,this.bus=t,this.use_mouse=this.enable_mouse_stream=!1,this.have_mouse=!0,this.mouse_clicks=this.mouse_delta_y=this.mouse_delta_x=0,this.have_keyboard=!0,this.next_read_resolution=this.next_read_rate=this.next_handle_scan_code_set=this.next_read_led=this.next_read_sample=this.next_is_mouse_command=this.enable_keyboard_stream=!1,this.kbd_buffer=new ByteQueue(1024),this.last_port60_byte=0,this.sample_rate=100,this.resolution=4,this.scaling2=!1,this.last_mouse_packet=-1,this.mouse_buffer=new ByteQueue(1024),this.bus.register("keyboard-code",function(e){this.kbd_send_code(e)},this),this.bus.register("mouse-click",function(e){this.mouse_send_click(e[0],e[1],e[2])},this),this.bus.register("mouse-delta",function(e){this.mouse_send_delta(e[0],e[1])},this),this.bus.register("mouse-wheel",function(e){},this),this.command_register=5,this.read_command_register=this.read_output_register=!1,e.io.register_read(96,this,this.port60_read),e.io.register_read(100,this,this.port64_read),e.io.register_write(96,this,this.port60_write),e.io.register_write(100,this,this.port64_write)}function PIC(e,t){this.irq_value=this.irr=this.isr=this.irq_map=this.irq_mask=0,this.requested_irq=-1,this.master=t,this.is_master=void 0===this.master,this.slave=void 0,this.name=this.is_master?"master":"slave ",this.expect_icw4=!1,this.read_isr=this.state=0,this.auto_eoi=1,this.elcr=this.special_mask_mode=0,this.cpu=e,this.is_master?(this.slave=new PIC(this.cpu,this),this.check_irqs=function(){if(0<=this.requested_irq)PIC_LOG_VERBOSE&&dbg_log("master> Already requested irq: "+this.requested_irq,LOG_PIC),this.cpu.handle_irqs();else{var e=this.irr&this.irq_mask;if(e){e&=-e;var t=this.special_mask_mode?this.irq_mask:-1;this.isr&&(this.isr&-this.isr&t)<=e?dbg_log("master> higher prio: isr="+h(this.isr,2)+" mask="+h(255&this.irq_mask,2)+" irq="+h(e,2),LOG_PIC):(dbg_assert(0!==e),t=v86util.int_log2_byte(e),dbg_assert(e===1<<t),PIC_LOG_VERBOSE&&dbg_log("master> request irq "+t,LOG_PIC),this.requested_irq=t,this.cpu.handle_irqs())}else PIC_LOG_VERBOSE&&dbg_log("master> no unmasked irrs. irr="+h(this.irr,2)+" mask="+h(255&this.irq_mask,2)+" isr="+h(this.isr,2),LOG_PIC)}},this.acknowledge_irq=function(){if(-1!==this.requested_irq)if(0===this.irr)PIC_LOG_VERBOSE&&dbg_log("master> spurious requested="+this.requested_irq,LOG_PIC),this.requested_irq=-1,this.cpu.pic_call_irq(7|this.irq_map);else{dbg_assert(this.irr),dbg_assert(0<=this.requested_irq);var e=1<<this.requested_irq;0==(this.elcr&e)&&(this.irr&=~e),this.auto_eoi||(this.isr|=e),PIC_LOG_VERBOSE&&dbg_log("master> acknowledge "+this.requested_irq,LOG_PIC),2===this.requested_irq?this.slave.acknowledge_irq():this.cpu.pic_call_irq(this.irq_map|this.requested_irq),this.requested_irq=-1,this.check_irqs()}}):(this.check_irqs=function(){if(0<=this.requested_irq)PIC_LOG_VERBOSE&&dbg_log("slave > Already requested irq: "+this.requested_irq,LOG_PIC),this.cpu.handle_irqs();else{var e=this.irr&this.irq_mask;if(e){e&=-e;var t=this.special_mask_mode?this.irq_mask:-1;this.isr&&(this.isr&-this.isr&t)<=e?PIC_LOG_VERBOSE&&dbg_log("slave > higher prio: isr="+h(this.isr,2)+" irq="+h(e,2),LOG_PIC):(dbg_assert(0!==e),t=v86util.int_log2_byte(e),dbg_assert(e===1<<t),PIC_LOG_VERBOSE&&dbg_log("slave > request irq "+t,LOG_PIC),this.requested_irq=t,this.master.set_irq(2))}else PIC_LOG_VERBOSE&&dbg_log("slave > no unmasked irrs. irr="+h(this.irr,2)+" mask="+h(255&this.irq_mask,2)+" isr="+h(this.isr,2),LOG_PIC)}},this.acknowledge_irq=function(){if(-1!==this.requested_irq)if(0===this.irr)PIC_LOG_VERBOSE&&dbg_log("slave > spurious requested="+this.requested_irq,LOG_PIC),this.requested_irq=-1,
this.master.irq_value&=-5,this.cpu.pic_call_irq(7|this.irq_map);else{dbg_assert(this.irr),dbg_assert(0<=this.requested_irq);var e=1<<this.requested_irq;0==(this.elcr&e)&&(this.irr&=~e),this.auto_eoi||(this.isr|=e),this.master.irq_value&=-5,PIC_LOG_VERBOSE&&dbg_log("slave > acknowledge "+this.requested_irq,LOG_PIC),this.cpu.pic_call_irq(this.irq_map|this.requested_irq),this.requested_irq=-1,this.check_irqs()}}),this.dump=function(){dbg_log("mask: "+h(255&this.irq_mask),LOG_PIC),dbg_log("base: "+h(this.irq_map),LOG_PIC),dbg_log("requested: "+h(this.irr),LOG_PIC),dbg_log("serviced: "+h(this.isr),LOG_PIC),this.is_master&&this.slave.dump()},this.is_master?(e=32,t=1232):(e=160,t=1233),this.cpu.io.register_write(e,this,this.port20_write),this.cpu.io.register_read(e,this,this.port20_read),this.cpu.io.register_write(1|e,this,this.port21_write),this.cpu.io.register_read(1|e,this,this.port21_read),this.cpu.io.register_write(t,this,this.port4D0_write),this.cpu.io.register_read(t,this,this.port4D0_read),this.is_master?(this.set_irq=function(e){dbg_assert(0<=e&&16>e),8<=e?this.slave.set_irq(e-8):(PIC_LOG_VERBOSE&&dbg_log("master> set irq "+e,LOG_PIC),e=1<<e,0==(this.irq_value&e)&&(this.irr|=e,this.irq_value|=e,this.check_irqs()))},this.clear_irq=function(e){dbg_assert(0<=e&&16>e),PIC_LOG_VERBOSE&&dbg_log("master> clear irq "+e,LOG_PIC),8<=e?this.slave.clear_irq(e-8):(e=1<<e,this.irq_value&e&&(this.irq_value&=~e,this.irr&=~e,this.check_irqs()))}):(this.set_irq=function(e){dbg_assert(0<=e&&8>e),PIC_LOG_VERBOSE&&dbg_log("slave > set irq "+e,LOG_PIC),e=1<<e,0==(this.irq_value&e)&&(this.irr|=e,this.irq_value|=e,this.check_irqs())},this.clear_irq=function(e){dbg_assert(0<=e&&8>e),PIC_LOG_VERBOSE&&dbg_log("slave > clear irq "+e,LOG_PIC),e=1<<e,this.irq_value&e&&(this.irq_value&=~e,this.irr&=~e,this.check_irqs())}),this.get_isr=function(){return this.isr}}function RTC(e){this.cpu=e,this.cmos_index=0,this.cmos_data=new Uint8Array(128),this.last_update=this.rtc_time=Date.now(),this.next_interrupt=0,this.periodic_interrupt=!1,this.periodic_interrupt_time=.9765625,this.cmos_a=38,this.cmos_b=2,this.nmi_disabled=this.cmos_c=0,e.io.register_write(112,this,function(e){this.cmos_index=127&e,this.nmi_disabled=e>>7}),e.io.register_write(113,this,this.cmos_port_write),e.io.register_read(113,this,this.cmos_port_read)}function UART(e,t,s){if(this.bus=s,this.cpu=e,this.ints=1<<UART_IIR_THRI,this.line_control=this.baud_rate=0,this.lsr=UART_LSR_TRANSMITTER_EMPTY|UART_LSR_TX_EMPTY,this.ier=this.fifo_control=0,this.iir=UART_IIR_NO_INT,this.irq=this.scratch_register=this.modem_status=this.modem_control=0,this.input=new ByteQueue(4096),this.current_line=[],1e3===t||1016===t)this.irq=4;else{if(1e3!==t&&1e3!==t)return void dbg_log("Invalid port: "+h(t),LOG_SERIAL);this.irq=3}this.bus.register("serial0-input",function(e){this.data_received(e)},this),e=e.io,e.register_write(t,this,function(e){this.write_data(e)},function(e){this.write_data(255&e),this.write_data(e>>8)}),e.register_write(1|t,this,function(e){this.line_control&DLAB?(this.baud_rate=255&this.baud_rate|e<<8,dbg_log("baud rate: "+h(this.baud_rate),LOG_SERIAL)):(this.ier=15&e,dbg_log("interrupt enable: "+h(e),LOG_SERIAL),this.CheckInterrupt())}),e.register_read(t,this,function(){if(this.line_control&DLAB)return 255&this.baud_rate;var e=this.input.shift();return-1===e?dbg_log("Read input empty",LOG_SERIAL):dbg_log("Read input: "+h(e),LOG_SERIAL),0===this.input.length&&(this.lsr&=~UART_LSR_DATA_READY,this.ClearInterrupt(UART_IIR_CTI)),e}),e.register_read(1|t,this,function(){return this.line_control&DLAB?this.baud_rate>>8:15&this.ier}),e.register_read(2|t,this,function(){var e=15&this.iir|192;return dbg_log("read interrupt identification: "+h(this.iir),LOG_SERIAL),this.iir==UART_IIR_THRI&&this.ClearInterrupt(UART_IIR_THRI),e}),e.register_write(2|t,this,function(e){dbg_log("fifo control: "+h(e),LOG_SERIAL),this.fifo_control=e}),e.register_read(3|t,this,function(){return dbg_log("read line control: "+h(this.line_control),LOG_SERIAL),this.line_control}),e.register_write(3|t,this,function(e){dbg_log("line control: "+h(e),LOG_SERIAL),this.line_control=e}),e.register_read(4|t,this,function(){return this.modem_control}),e.register_write(4|t,this,function(e){dbg_log("modem control: "+h(e),LOG_SERIAL),this.modem_control=e}),e.register_read(5|t,this,function(){return dbg_log("read line status: "+h(this.lsr),LOG_SERIAL),this.lsr}),e.register_write(5|t,this,function(e){dbg_log("Factory test write",LOG_SERIAL)}),e.register_read(6|t,this,function(){return dbg_log("read modem status: "+h(this.modem_status),LOG_SERIAL),this.modem_status}),e.register_write(6|t,this,function(e){dbg_log("Unkown register write (base+6)",LOG_SERIAL)}),e.register_read(7|t,this,function(){return this.scratch_register}),e.register_write(7|t,this,function(e){this.scratch_register=e})}function HPET(e){function t(){return i?(Date.now()-_)*HPET_FREQ_MS+a|0:a}function s(){return HPET_SUPPORT_64?i?(Date.now()-_)*(HPET_FREQ_MS/4294967296)+o|0:o:0}var r=this,i=!1,_=Date.now(),a=0,o=0,n=!1,d=0,g=new Int32Array(HPET_NUM_COUNTERS<<1),c=new Int32Array(HPET_NUM_COUNTERS<<1),p=new Int32Array(HPET_NUM_COUNTERS<<1),u=0;this.legacy_mode=!1,this.timer=function(s){if(i){s=t()>>>0;for(var r,_,a=0;a<HPET_NUM_COUNTERS;a++)r=g[a<<1],_=c[a<<1]>>>0,(u<=s?_>u&&_<=s:_>u||_<=s)&&(_=4&r,2&r?(_=_&&!(d&1<<a),d|=1<<a):d&=~(1<<a),8&r&&(c[a<<1]+=p[a<<1]),_&&e.device_raise_irq(0));u=s}},e.io.mmap_register(HPET_ADDR,16384,function(e){switch(dbg_log("Read "+h(e,4)+" (ctr="+h(t()>>>0)+")",LOG_HPET),e){case 0:return HPET_NUM_COUNTERS-1<<8|98305|HPET_SUPPORT_64<<13;case 4:return HPET_PERIOD;case 16:return r.legacy_mode<<1|i;case 240:return t();case 244:return s()}var _=e>>2&7,a=e-256>>5;if(256>e||a>=HPET_NUM_COUNTERS||5<_)return dbg_log("Read reserved address: "+h(e),LOG_HPET),0;switch(dbg_log("Read counter: addr="+h(e)+" counter="+h(a,2)+" reg="+h(_),LOG_HPET),_){case 0:return g[a<<1]&~HPET_COUNTER_CONFIG_MASK|HPET_COUNTER_CONFIG;case 1:return g[a<<1|1];case 2:return c[a<<1];case 3:return c[a<<1|1];case 4:case 5:return 0}},function(e,u){switch(dbg_log("Write "+h(e,4)+": "+h(u,2),LOG_HPET),e){case 16:return dbg_log("conf: enabled="+(1&u)+" legacy="+(u>>1&1),LOG_HPET),1&(i^u)&&(1&u?_=Date.now():(a=t(),o=s())),i=1==(1&u),void(r.legacy_mode=2==(2&u));case 32:return void(d&=~u);case 240:return void(a=u);case 244:return void(o=u)}var l=e>>2&7,f=e-256>>5;if(256>e||f>=HPET_NUM_COUNTERS||2<l)dbg_log("Write reserved address: "+h(e)+" data="+h(u),LOG_HPET);else switch(dbg_log("Write counter: addr="+h(e)+" counter="+h(f,2)+" reg="+h(l)+" data="+h(u,2),LOG_HPET),l){case 0:g[f<<1]=u;break;case 2:n?(p[f<<1]=u,n=!1,dbg_log("Accumulator acc="+h(u>>>0,8)+" ctr="+h(f,2),LOG_HPET)):(c[f<<1]=u,64&g[f<<1]&&(n=!0,g[f<<1]&=-65));break;case 3:c[f<<1|1]=u}})}function ACPI(e){this.cpu=e;var t=e.io;e.devices.pci.register_device({pci_id:56,pci_space:[134,128,19,113,7,0,128,2,8,0,128,6,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,1,0,0],pci_bars:[],name:"acpi"}),this.status=1,this.pm1_enable=this.pm1_status=0,this.last_timer=this.get_timer(v86.microtick()),this.gpe=new Uint8Array(4),t.register_read(45056,this,void 0,function(){return dbg_log("ACPI pm1_status read",LOG_ACPI),this.pm1_status}),t.register_write(45056,this,void 0,function(e){dbg_log("ACPI pm1_status write: "+h(e,4),LOG_ACPI),this.pm1_status&=~e}),t.register_read(45058,this,void 0,function(){return dbg_log("ACPI pm1_enable read",LOG_ACPI),this.pm1_enable}),t.register_write(45058,this,void 0,function(e){dbg_log("ACPI pm1_enable write: "+h(e),LOG_ACPI),this.pm1_enable=e}),t.register_read(45060,this,void 0,function(){return dbg_log("ACPI status read",LOG_ACPI),this.status}),t.register_write(45060,this,void 0,function(e){dbg_log("ACPI status write: "+h(e),LOG_ACPI),this.status=e}),t.register_read(45064,this,void 0,void 0,function(){return 16777215&this.get_timer(v86.microtick())}),t.register_read(45024,this,function(){return dbg_log("Read gpe#0",LOG_ACPI),this.gpe[0]}),t.register_read(45025,this,function(){return dbg_log("Read gpe#1",LOG_ACPI),this.gpe[1]}),t.register_read(45026,this,function(){return dbg_log("Read gpe#2",LOG_ACPI),this.gpe[2]}),t.register_read(45027,this,function(){return dbg_log("Read gpe#3",LOG_ACPI),this.gpe[3]}),t.register_write(45024,this,function(e){dbg_log("Write gpe#0: "+h(e),LOG_ACPI),this.gpe[0]=e}),t.register_write(45025,this,function(e){dbg_log("Write gpe#1: "+h(e),LOG_ACPI),this.gpe[1]=e}),t.register_write(45026,this,function(e){dbg_log("Write gpe#2: "+h(e),LOG_ACPI),this.gpe[2]=e}),t.register_write(45027,this,function(e){dbg_log("Write gpe#3: "+h(e),LOG_ACPI),this.gpe[3]=e})}function APIC(e){var t=this;this.cpu=e,this.timer_divider=this.apic_id=0,this.timer_divider_shift=1,this.timer_current_count=this.timer_initial_count=0,this.next_tick=v86.microtick(),this.lvt_error=this.lvt_int1=this.lvt_int0=this.lvt_perf_counter=this.lvt_timer=IOAPIC_CONFIG_MASKED,this.icr1=this.icr0=this.tpr=0,this.irr=new Int32Array(8),this.isr=new Int32Array(8),this.tmr=new Int32Array(8),this.spurious_vector=254,this.destination_format=-1,this.read_error=this.error=this.local_destination=0,e.io.mmap_register(APIC_ADDRESS,1048576,function(e){dbg_log("Unsupported read8 from apic: "+h(e>>>0),LOG_APIC);var s=3&e;return t.read32(-4&e)>>8*s&255},function(e,t){dbg_log("Unsupported write8 from apic: "+h(e)+" <- "+h(t),LOG_APIC),dbg_trace(),dbg_assert(!1)},function(e){return t.read32(e)},function(e,s){return t.write32(e,s)})}function IOAPIC(e){var t=this;this.cpu=e,this.ioredtbl_config=new Int32Array(IOAPIC_IRQ_COUNT),this.ioredtbl_destination=new Int32Array(IOAPIC_IRQ_COUNT);for(var s=0;s<this.ioredtbl_config.length;s++)this.ioredtbl_config[s]=IOAPIC_CONFIG_MASKED;this.ioregsel=0,this.ioapic_id=IOAPIC_ID,this.irq_value=this.irr=0,dbg_assert(32<=MMAP_BLOCK_SIZE),e.io.mmap_register(IOAPIC_ADDRESS,MMAP_BLOCK_SIZE,function(e){return dbg_assert(!1,"unsupported read8 from ioapic: "+h(e)),0},function(e,t){dbg_assert(!1,"unsupported write8 from ioapic: "+h(e))},function(e){return(e=e-IOAPIC_ADDRESS|0)===IOREGSEL?t.ioregsel:e===IOWIN?t.read(t.ioregsel):(dbg_log("Unexpected IOAPIC register read: "+h(e),LOG_APIC),dbg_assert(!1),0)},function(e,s){e=e-IOAPIC_ADDRESS|0,e===IOREGSEL?t.ioregsel=s:e===IOWIN?t.write(t.ioregsel,s):(dbg_log("Unexpected IOAPIC register write: "+h(e)+" <- "+h(s>>>0,8),LOG_APIC),dbg_assert(!1))})}function StateLoadError(e){this.message=e}function save_object(e,t){if("object"!=typeof e||null===e||e instanceof Array)return e;if(dbg_assert(e.constructor!==Object),e.BYTES_PER_ELEMENT){var s=new Uint8Array(e.buffer,e.byteOffset,e.length*e.BYTES_PER_ELEMENT);return{__state_type__:e.constructor.name,buffer_id:t.push(s)-1}}DEBUG&&!e.get_state&&console.log("Object without get_state: ",e),e=e.get_state(),s=[];for(var r=0;r<e.length;r++){var i=e[r];dbg_assert("function"!=typeof i),s[r]=save_object(i,t)}return s}function restore_object(e,t,s){if("object"!=typeof t||null===t)return t;if(e instanceof Array)return t;var r=t.__state_type__;if(void 0===r){DEBUG&&void 0===e&&(console.log("Cannot restore (base doesn't exist)",t),dbg_assert(!1)),DEBUG&&!e.get_state&&console.log("No get_state:",e);var i=e.get_state();for(dbg_assert(i.length===t.length,"Cannot restore: Different number of properties"),r=0;r<t.length;r++)t[r]=restore_object(i[r],t[r],s);return e.set_state(t),e}return i={Uint8Array:Uint8Array,Int8Array:Int8Array,Uint16Array:Uint16Array,Int16Array:Int16Array,Uint32Array:Uint32Array,Int32Array:Int32Array,Float32Array:Float32Array,Float64Array:Float64Array}[r],dbg_assert(i,"Unkown type: "+r),t=s.infos[t.buffer_id],dbg_assert(e),dbg_assert(e.constructor===i),1048576<=t.length&&i===Uint8Array?new Uint8Array(s.full,t.offset,t.length):(e=s.full.slice(t.offset,t.offset+t.length),new i(e))}function Ne2k(e,t){this.cpu=e,this.pci=e.devices.pci,this.bus=t,this.bus.register("net0-receive",function(e){this.receive(e)},this),this.port=768,this.name="ne2k",this.pci_space=[236,16,41,128,3,1,0,0,0,0,0,2,0,0,0,0,255&this.port|1,this.port>>8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,26,0,17,0,0,184,254,0,0,0,0,0,0,0,0,0,1,0,0],this.pci_id=40,this.pci_bars=[{size:32}],this.imr=this.isr=0,this.cr=1,this.tpsr=this.tcnt=this.rcnt=this.dcfg=0,this.memory=new Uint8Array(32768),this.txcr=this.rxcr=0,this.tsr=1,t=[0,34,21,255*Math.random()|0,255*Math.random()|0,255*Math.random()|0];for(var s=0;6>s;s++)this.memory[s<<1]=this.memory[s<<1|1]=t[s];this.memory[14]=this.memory[15]=87,dbg_log("Mac: "+h(t[0],2)+":"+h(t[1],2)+":"+h(t[2],2)+":"+h(t[3],2)+":"+h(t[4],2)+":"+h(t[5],2),LOG_NET),this.rsar=0,this.pstart=START_PAGE,this.pstop=STOP_PAGE,this.boundary=this.curpg=START_RX_PAGE,t=e.io,t.register_read(this.port|E8390_CMD,this,function(){return dbg_log("Read cmd",LOG_NET),this.cr}),t.register_write(this.port|E8390_CMD,this,function(e){this.cr=-5&e,dbg_log("Write command: "+h(e,2)+" newpg="+(this.cr>>6)+" txcr="+h(this.txcr,2),LOG_NET),1&this.cr||(24|e&&0===this.rcnt&&this.do_interrupt(ENISR_RDC),4&e&&(e=this.tpsr<<8,e=this.memory.subarray(e,e+this.tcnt),this.bus.send("net0-send",e),this.bus.send("eth-transmit-end",[e.length]),this.do_interrupt(ENISR_TX),dbg_log("Command: Transfer. length="+h(e.byteLength),LOG_NET)))}),t.register_read(this.port|EN0_COUNTER0,this,function(){return dbg_log("Read counter0",LOG_NET),0}),t.register_read(this.port|EN0_COUNTER1,this,function(){return dbg_log("Read counter1",LOG_NET),0}),t.register_read(this.port|EN0_COUNTER2,this,function(){return dbg_log("Read counter2",LOG_NET),0}),t.register_read(this.port|NE_RESET,this,function(){return 0===this.get_page()?(dbg_log("Read reset",LOG_NET),this.do_interrupt(ENISR_RESET)):dbg_log("Read pg1/1f",LOG_NET),0}),t.register_write(this.port|NE_RESET,this,function(e){0===this.get_page()?dbg_log("Write reset: "+h(e,2),LOG_NET):dbg_log("Write pg1/1f: "+h(e),LOG_NET)}),t.register_write(this.port|EN0_STARTPG,this,function(e){0===this.get_page()?(dbg_log("start page: "+h(e,2),LOG_NET),this.pstart=e):dbg_log("pg1/1: "+h(e,2),LOG_NET)}),t.register_write(this.port|EN0_STOPPG,this,function(e){0===this.get_page()?(dbg_log("stop page: "+h(e,2),LOG_NET),this.pstop=e):dbg_log("pg1/2: "+h(e,2),LOG_NET)}),t.register_read(this.port|EN0_ISR,this,function(){return 0===this.get_page()?(dbg_log("Read isr: "+h(this.isr,2),LOG_NET),this.isr):(dbg_log("Read curpg: "+h(this.curpg,2),LOG_NET),this.curpg)}),t.register_write(this.port|EN0_ISR,this,function(e){0===this.get_page()?(dbg_log("Write isr: "+h(e,2),LOG_NET),this.isr&=~e,this.update_irq()):(dbg_log("Write curpg: "+h(e,2),LOG_NET),this.curpg=e)}),t.register_write(this.port|EN0_TXCR,this,function(e){0===this.get_page()?(this.txcr=e,dbg_log("Write tx config: "+h(e,2),LOG_NET)):dbg_log("Write pg1/0x0d "+h(e,2),LOG_NET)}),t.register_write(this.port|EN0_DCFG,this,function(e){0===this.get_page()?(dbg_log("Write data configuration: "+h(e,2),LOG_NET),this.dcfg=e):dbg_log("Write pg1/0x0e "+h(e,2),LOG_NET)}),t.register_write(this.port|EN0_RCNTLO,this,function(e){0===this.get_page()?(dbg_log("Write remote byte count low: "+h(e,2),LOG_NET),this.rcnt=65280&this.rcnt|255&e):dbg_log("Write pg1/0x0a "+h(e,2),LOG_NET)}),t.register_write(this.port|EN0_RCNTHI,this,function(e){0===this.get_page()?(dbg_log("Write remote byte count high: "+h(e,2),LOG_NET),this.rcnt=255&this.rcnt|e<<8&65280):dbg_log("Write pg1/0x0b "+h(e,2),LOG_NET)}),t.register_write(this.port|EN0_RSARLO,this,function(e){0===this.get_page()?(dbg_log("Write remote start address low: "+h(e,2),LOG_NET),this.rsar=65280&this.rsar|255&e):dbg_log("Write pg1/0x08 "+h(e,2),LOG_NET)}),t.register_write(this.port|EN0_RSARHI,this,function(e){0===this.get_page()?(dbg_log("Write start addresse count high: "+h(e,2),LOG_NET),this.rsar=255&this.rsar|e<<8&65280):dbg_log("Write pg1/0x09 "+h(e,2),LOG_NET)}),t.register_write(this.port|EN0_IMR,this,function(e){0===this.get_page()?(dbg_log("Write interrupt mask register: "+h(e,2)+" isr="+h(this.isr,2),LOG_NET),this.imr=e,this.update_irq()):dbg_log("Write pg1/0x0f "+h(e,2),LOG_NET)}),t.register_read(this.port|EN0_BOUNDARY,this,function(){return 0===this.get_page()?(dbg_log("Read boundary: "+h(this.boundary,2),LOG_NET),this.boundary):(dbg_log("Read pg1/0x03",LOG_NET),0)}),t.register_write(this.port|EN0_BOUNDARY,this,function(e){0===this.get_page()?(dbg_log("Write boundary: "+h(e,2),LOG_NET),this.boundary=e):dbg_log("Write pg1/0x03 "+h(e,2),LOG_NET)}),t.register_read(this.port|EN0_TSR,this,function(){return 0===this.get_page()?this.tsr:(dbg_log("Read pg1/0x04",LOG_NET),0)}),t.register_write(this.port|EN0_TPSR,this,function(e){0===this.get_page()?(dbg_log("Write tpsr: "+h(e,2),LOG_NET),this.tpsr=e):dbg_log("Write pg1/0x04 "+h(e,2),LOG_NET)}),t.register_write(this.port|EN0_TCNTLO,this,function(e){0===this.get_page()?(dbg_log("Write tcnt low: "+h(e,2),LOG_NET),this.tcnt=-256&this.tcnt|e):dbg_log("Write pg1/0x05 "+h(e,2),LOG_NET)}),t.register_write(this.port|EN0_TCNTHI,this,function(e){0===this.get_page()?(dbg_log("Write tcnt high: "+h(e,2),LOG_NET),this.tcnt=255&this.tcnt|e<<8):dbg_log("Write pg1/0x06 "+h(e,2),LOG_NET)}),t.register_read(this.port|EN0_RSR,this,function(){return 0===this.get_page()?9:(dbg_log("Read pg1/0x0c",LOG_NET),0)}),t.register_write(this.port|EN0_RXCR,this,function(e){dbg_log("RX configuration reg write: "+h(e,2),LOG_NET),this.rxcr=e}),t.register_read(this.port|NE_DATAPORT|0,this,this.data_port_read8,this.data_port_read16,this.data_port_read32),t.register_write(this.port|NE_DATAPORT|0,this,this.data_port_write16,this.data_port_write16,this.data_port_write32),e.devices.pci.register_device(this)}function SB16(e,t){this.cpu=e,this.cpu_paused=!1,this.bus=t,this.write_buffer=new ByteQueue(DSP_BUFSIZE),this.read_buffer=new ByteQueue(DSP_BUFSIZE),this.read_buffer_lastvalue=0,this.command=DSP_NO_COMMAND,this.mixer_current_address=this.command_size=0,this.mixer_unhandled_registers=new Uint8Array(256),this.dummy_speaker_enabled=!1,this.test_register=0,this.dsp_signed=this.dsp_16bit=this.dsp_stereo=this.dsp_highspeed=!1,this.dac_buffers=[new FloatQueue(DSP_DACSIZE),new FloatQueue(DSP_DACSIZE)],this.dac_rate_ratio=2,this.dac_process_samples=SB_DMA_BLOCK_SAMPLES,this.dma=e.devices.dma,this.dma_channel=this.dma_irq=this.dma_bytes_block=this.dma_bytes_left=this.dma_bytes_count=this.dma_sample_count=0,this.dma_channel_8bit=SB_DMA_CHANNEL_8BIT,this.dma_channel_16bit=SB_DMA_CHANNEL_16BIT,this.dma_autoinit=!1,this.dma_buffer=new ArrayBuffer(SB_DMA_BUFSIZE),this.dma_buffer_int8=new Int8Array(this.dma_buffer),this.dma_buffer_uint8=new Uint8Array(this.dma_buffer),this.dma_buffer_int16=new Int16Array(this.dma_buffer),this.dma_buffer_uint16=new Uint16Array(this.dma_buffer),this.dma_syncbuffer=new SyncBuffer(this.dma_buffer),this.dma_paused=this.dma_waiting_transfer=!1,this.sampling_rate=22050,this.bytes_per_sample=1,this.e2_value=170,this.e2_count=0,this.asp_registers=new Uint8Array(256),this.mpu_read_buffer=new ByteQueue(DSP_BUFSIZE),this.fm_current_address1=this.fm_current_address0=this.mpu_read_buffer_lastvalue=0,this.fm_waveform_select_enable=!1,this.irq=SB_IRQ,this.irq_triggered=new Uint8Array(16),this.audio_samplerate=48e3,e.io.register_read(544,this,this.port2x0_read),e.io.register_read(545,this,this.port2x1_read),e.io.register_read(546,this,this.port2x2_read),e.io.register_read(547,this,this.port2x3_read),e.io.register_read(548,this,this.port2x4_read),e.io.register_read(549,this,this.port2x5_read),e.io.register_read(550,this,this.port2x6_read),e.io.register_read(551,this,this.port2x7_read),e.io.register_read(552,this,this.port2x8_read),e.io.register_read(553,this,this.port2x9_read),e.io.register_read(554,this,this.port2xA_read),e.io.register_read(555,this,this.port2xB_read),e.io.register_read(556,this,this.port2xC_read),e.io.register_read(557,this,this.port2xD_read),e.io.register_read(558,this,this.port2xE_read),e.io.register_read(559,this,this.port2xF_read),e.io.register_write(544,this,this.port2x0_write),e.io.register_write(545,this,this.port2x1_write),e.io.register_write(546,this,this.port2x2_write),e.io.register_write(547,this,this.port2x3_write),e.io.register_write(548,this,this.port2x4_write),e.io.register_write(549,this,this.port2x5_write),e.io.register_write(550,this,this.port2x6_write),e.io.register_write(551,this,this.port2x7_write),e.io.register_write(552,this,this.port2x8_write),e.io.register_write(553,this,this.port2x9_write),e.io.register_write(554,this,this.port2xA_write),e.io.register_write(555,this,this.port2xB_write),e.io.register_write(556,this,this.port2xC_write),e.io.register_write(557,this,this.port2xD_write),e.io.register_write(558,this,this.port2xE_write),e.io.register_write(559,this,this.port2xF_write),e.io.register_read(816,this,this.port3x0_read),e.io.register_read(817,this,this.port3x1_read),e.io.register_write(816,this,this.port3x0_write),e.io.register_write(817,this,this.port3x1_write),this.dma.on_unmask(this.dma_on_unmask,this),t.register("speaker-tell-samplerate",function(e){this.audio_samplerate=e},this),t.send("speaker-request-samplerate"),t.register("speaker-request-data",function(e){this.audio_send(e)},this),t.register("cpu-stop",function(){this.cpu_paused=!0,t.send("speaker-update-enable",!1)},this),t.register("cpu-run",function(){this.cpu_paused=!1,t.send("speaker-update-enable",!this.dma_paused)},this),this.reset_dsp()}function register_dsp_command(e,t,s){s||(s=SB16.prototype.dsp_default_handler);for(var r=0;r<e.length;r++)DSP_COMMAND_SIZES[e[r]]=t,DSP_COMMAND_HANDLERS[e[r]]=s}function any_first_digit(e){for(var t=[],s=0;16>s;s++)t.push(e+s);return t}function register_mixer_read(e,t){t||(t=SB16.prototype.mixer_default_read),MIXER_READ_HANDLERS[e]=t}function register_mixer_write(e,t){t||(t=SB16.prototype.mixer_default_write),MIXER_WRITE_HANDLERS[e]=t}function register_fm_write(e,t){t||(t=SB16.prototype.fm_default_write);for(var s=0;s<e.length;s++)FM_HANDLERS[e[s]]=t}function between(e,t){for(var s=[];e<=t;e++)s.push(e);return s}function get_fm_operator(e,t){return 18*e+SB_FM_OPERATORS_BY_OFFSET[t]}function audio_normalize(e,t,s){return audio_clip(e/t+s,-1,1)}function audio_clip(e,t,s){return(e<t)*t+(e>s)*s+(t<=e&&e<=s)*e}function VirtIO(e,t,s){this.pci_space=[244,26,9,16,7,5,16,0,0,0,2,0,0,0,0,0,1,168,0,0,0,16,191,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,26,9,0,0,0,0,0,64,0,0,0,0,0,0,0,0,1,0,0],this.pci_id=48,this.pci_bars=[{size:256}],this.name="virtio";var r=e.io;r.register_read(43008,this,function(){return dbg_log("Read device features",LOG_VIRTIO),1},void 0,function(){return dbg_log("Read device features",LOG_VIRTIO),1}),r.register_write(43012,this,void 0,void 0,function(e){dbg_log("Guest feature selection: "+h(e,8),LOG_VIRTIO)}),r.register_write(43022,this,void 0,function(e){dbg_log("Queue select: "+h(e,4),LOG_VIRTIO),this.queue_select=e},void 0),r.register_read(43020,this,void 0,function(){return dbg_log("Read queue size",LOG_VIRTIO),this.queue_size},void 0),r.register_read(43016,this,void 0,void 0,function(){return dbg_log("Read queue address",LOG_VIRTIO),0===this.queue_select?this.queue_address:0}),r.register_write(43016,this,void 0,void 0,function(e){dbg_log("Write queue address: "+h(e,8),LOG_VIRTIO),this.queue_address=e}),r.register_write(43026,this,function(e){dbg_log("Write device status: "+h(e,2),LOG_VIRTIO),0===e?(dbg_log("Reset",LOG_VIRTIO),this.reset()):128&e?dbg_log("Warning: Device status failed",LOG_VIRTIO):dbg_log((1&e?"ACKNOWLEDGE ":"")+(2&e?"DRIVER ":"")+(4&e?"DRIVER_OK":""),LOG_VIRTIO),this.device_status=e}),r.register_read(43026,this,function(){return dbg_log("Read device status: "+h(this.device_status),LOG_VIRTIO),this.device_status}),r.register_read(43027,this,function(){dbg_log("Read isr",LOG_VIRTIO);var e=this.isr;return this.isr=0,this.pci.lower_irq(this.pci_id),e}),r.register_write(43024,this,void 0,function(e){dbg_log("Write queue notify: "+h(e,4),LOG_VIRTIO),dbg_assert(0===e);var t=(this.queue_address<<12)+16*this.queue_size;e=t+4,t=this.cpu.read16(t+2),dbg_log("idx="+h(t,4),LOG_VIRTIO);var s=this.queue_size-1;for(t&=s;this.last_idx!==t;){var r=this.cpu.read16(e+2*this.last_idx);this.handle_descriptor(r),this.last_idx=this.last_idx+1&s}}),this.cpu=e,this.pci=e.devices.pci,this.bus=t,this.last_idx=this.isr=this.device_status=this.queue_select=0,this.queue_size=32;for(var i=this.queue_address=0;128>i;i++)r.register_read(43028+i,this,function(e){return dbg_log("Read device "+h(e),LOG_VIRTIO),e<this.device.configspace.length?this.device.configspace[e]:0}.bind(this,i),void 0,void 0),r.register_write(43028+i,this,function(e,t){dbg_log("Write device "+h(e)+": "+h(t,2),LOG_VIRTIO)}.bind(this,i),void 0,void 0);this.device=new Virtio9p(s,t),this.device.SendReply=this.device_reply.bind(this),e.devices.pci.register_device(this)}function BusConnector(){this.listeners={},this.pair=void 0}function do_the_log(e){LOG_TO_FILE?log_data.push(e,"\n"):console.log(e)}function dbg_trace(e){DEBUG&&dbg_log(Error().stack.replace(/(?:(?:t|t16|t32)\.\(anonymous function\)\.)+/g,"t.(anonymous function)."),e)}function dbg_assert(e,t,s){DEBUG&&(e||dbg_assert_failed(t))}function dbg_assert_failed(e){if(console.trace(),e)throw"Assert failed: "+e;throw"Assert failed"}function CPU(e){this.memory_size=0,this.a20_enabled=!0,this.mem_page_infos=void 0,this.mem8=new Uint8Array(0),this.mem16=new Uint16Array(this.mem8.buffer),this.mem32s=new Int32Array(this.mem8.buffer),this.segment_is_null=new Uint8Array(8),this.segment_limits=new Uint32Array(8),this.segment_offsets=new Int32Array(8),this.tlb_data=new Int32Array(1048576),this.tlb_info=new Uint8Array(1048576),this.tlb_info_global=new Uint8Array(1048576),this.protected_mode=!1,this.gdtr_offset=this.gdtr_size=this.idtr_offset=this.idtr_size=0,this.page_fault=this.tss_size_32=!1,this.cr=new Int32Array(8),this.cr[0]=0,this.cr[2]=0,this.cr[3]=0,this.page_size_extensions=this.cpl=this.cr[4]=0,this.in_hlt=this.stack_size_32=this.is_32=!1,this.last_result=this.last_add_result=this.last_op_size=this.last_op2=this.last_op1=this.flags_changed=this.flags=this.prefixes=this.sysenter_eip=this.sysenter_esp=this.sysenter_cs=this.esp_phys=this.last_virt_esp=this.eip_phys=this.last_virt_eip=0,this.mul32_result=new Int32Array(2),this.div32_result=new Float64Array(2),this.phys_addr_high=this.phys_addr=this.modrm_byte=this.tsc_offset=0,this.devices={},this.table=[],this.paging=!1,this.previous_ip=this.instruction_pointer=0,this.apic_enabled=!0,this.timestamp_counter=0,this.reg32s=new Int32Array(8),this.reg32=new Uint32Array(this.reg32s.buffer),this.reg16s=new Int16Array(this.reg32s.buffer),this.reg16=new Uint16Array(this.reg32s.buffer),this.reg8s=new Int8Array(this.reg32s.buffer),this.reg8=new Uint8Array(this.reg32s.buffer),this.reg_mmxs=new Int32Array(16),this.reg_mmx=new Uint32Array(this.reg_mmxs.buffer),this.reg_mmx8s=new Int8Array(this.reg_mmxs.buffer),this.reg_mmx8=new Uint8Array(this.reg_mmxs.buffer),this.reg_xmm32s=new Int32Array(32),this.mxcsr=8064,this.sreg=new Uint16Array(8),this.dreg=new Int32Array(8),this.memory_map_read8=[],this.memory_map_write8=[],this.memory_map_read32=[],this.memory_map_write32=[],this.bios={main:null,vga:null},this.fw_value=0,this.fpu=this.io=void 0,this.bus=e,dbg_assert(this.table16&&this.table32),dbg_assert(this.table0F_16&&this.table0F_32),this.update_operand_size(),this.tsc_offset=v86.microtick(),this.debug_init(),this.init2()}function DynamicTranslator(e){dbg_assert(!1),this.clear_cache=function(){},this.cycle_translated=function(){}}function string_get_cycle_count(e,t){return dbg_assert(e&&4>=e&&-4<=e),0>e?(4095&t)>>(-e>>1):(4095&~t)>>e}function string_get_cycle_count2(e,t,s){return dbg_assert(3===arguments.length),Math.min(string_get_cycle_count(e,t),string_get_cycle_count(e,s))}function cmpsb(e){var t=e.get_seg_prefix(reg_ds)+e.get_reg_asize(reg_esi)|0,s=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,r=e.flags&flag_direction?-1:1;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=(e.prefixes&PREFIX_MASK_REP)===PREFIX_REPZ,o=MAX_COUNT_PER_CYCLE,n=e.translate_address_read(t),d=e.translate_address_read(s);e.paging&&(o=string_get_cycle_count2(r,t,s));do{s=e.read8(d),t=e.read8(n),d+=r,n+=r;var h=0!=--i&&t===s===a}while(h&&o--);r=r*(_-i)|0,e.add_reg_asize(reg_edi,r),e.add_reg_asize(reg_esi,r),e.set_ecx_asize(i),e.timestamp_counter+=_-i,h&&(e.instruction_pointer=e.previous_ip)}else t=e.safe_read8(t),s=e.safe_read8(s),e.add_reg_asize(reg_edi,r),e.add_reg_asize(reg_esi,r);e.cmp8(t,s),e.diverged()}function cmpsw(e){var t=e.get_seg_prefix(reg_ds)+e.get_reg_asize(reg_esi)|0,s=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,r=e.flags&flag_direction?-2:2;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=(e.prefixes&PREFIX_MASK_REP)===PREFIX_REPZ,o=MAX_COUNT_PER_CYCLE;if(1&s||1&t)do{var n=e.safe_read16(s),d=e.safe_read16(t);s+=r,e.add_reg_asize(reg_edi,r),t+=r,e.add_reg_asize(reg_esi,r);var h=0!==e.decr_ecx_asize()&&d===n===a}while(h&&o--);else{var g=0>r?-1:1,c=e.translate_address_read(t)>>>1,p=e.translate_address_read(s)>>>1;e.paging&&(o=string_get_cycle_count2(r,t,s));do{n=e.read_aligned16(p),d=e.read_aligned16(c),p+=g,c+=g,h=0!=--i&&d===n===a}while(h&&o--);t=r*(_-i)|0,e.add_reg_asize(reg_edi,t),e.add_reg_asize(reg_esi,t),e.set_ecx_asize(i),e.timestamp_counter+=_-i}h&&(e.instruction_pointer=e.previous_ip)}else n=e.safe_read16(s),d=e.safe_read16(t),e.add_reg_asize(reg_edi,r),e.add_reg_asize(reg_esi,r);e.cmp16(d,n),e.diverged()}function cmpsd(e){var t=e.get_seg_prefix(reg_ds)+e.get_reg_asize(reg_esi)|0,s=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,r=e.flags&flag_direction?-4:4;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=(e.prefixes&PREFIX_MASK_REP)===PREFIX_REPZ,o=MAX_COUNT_PER_CYCLE;if(3&s||3&t)do{var n=e.safe_read32s(s),d=e.safe_read32s(t);s+=r,e.add_reg_asize(reg_edi,r),t+=r,e.add_reg_asize(reg_esi,r);var h=0!==e.decr_ecx_asize()&&d===n===a}while(h&&o--);else{var g=0>r?-1:1,c=e.translate_address_read(t)>>>2,p=e.translate_address_read(s)>>>2;e.paging&&(o=string_get_cycle_count2(r,t,s));do{n=e.read_aligned32(p),d=e.read_aligned32(c),p+=g,c+=g,h=0!=--i&&d===n===a}while(h&&o--);t=r*(_-i)|0,e.add_reg_asize(reg_edi,t),e.add_reg_asize(reg_esi,t),e.set_ecx_asize(i),e.timestamp_counter+=_-i}h&&(e.instruction_pointer=e.previous_ip)}else n=e.safe_read32s(s),d=e.safe_read32s(t),e.add_reg_asize(reg_edi,r),e.add_reg_asize(reg_esi,r);e.cmp32(d,n),e.diverged()}function stosb(e){var t=e.reg8[reg_al],s=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,r=e.flags&flag_direction?-1:1;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=MAX_COUNT_PER_CYCLE,o=e.translate_address_write(s);e.paging&&(a=string_get_cycle_count(r,s));do{e.write8(o,t),o+=r,s=0!=--i}while(s&&a--);e.add_reg_asize(reg_edi,r*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i,s&&(e.instruction_pointer=e.previous_ip)}else e.safe_write8(s,t),e.add_reg_asize(reg_edi,r);e.diverged()}function stosw(e){var t=e.reg16[reg_ax],s=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,r=e.flags&flag_direction?-2:2;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=MAX_COUNT_PER_CYCLE;if(1&s)do{e.safe_write16(s,t),s+=r,e.add_reg_asize(reg_edi,r);var o=0!==e.decr_ecx_asize()}while(o&&a--);else{var n=0>r?-1:1,d=e.translate_address_write(s)>>>1;e.paging&&(a=string_get_cycle_count(r,s));do{e.write_aligned16(d,t),d+=n,o=0!=--i}while(o&&a--);e.add_reg_asize(reg_edi,r*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i}o&&(e.instruction_pointer=e.previous_ip)}else e.safe_write16(s,t),e.add_reg_asize(reg_edi,r);e.diverged()}function stosd(e){var t=e.reg32s[reg_eax],s=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,r=e.flags&flag_direction?-4:4;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=MAX_COUNT_PER_CYCLE;if(3&s)do{e.safe_write32(s,t),s+=r,e.add_reg_asize(reg_edi,r);var o=0!==e.decr_ecx_asize()}while(o&&a--);else{
var n=0>r?-1:1,d=e.translate_address_write(s)>>>2;e.paging&&(a=string_get_cycle_count(r,s));do{e.write_aligned32(d,t),d+=n,o=0!=--i}while(o&&a--);e.add_reg_asize(reg_edi,r*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i}o&&(e.instruction_pointer=e.previous_ip)}else e.safe_write32(s,t),e.add_reg_asize(reg_edi,r);e.diverged()}function lodsb(e){var t=e.get_seg_prefix(reg_ds)+e.get_reg_asize(reg_esi)|0,s=e.flags&flag_direction?-1:1;if(e.prefixes&PREFIX_MASK_REP){var r=e.get_reg_asize(reg_ecx)>>>0;if(0===r)return;var i=r,_=MAX_COUNT_PER_CYCLE,a=e.translate_address_read(t);e.paging&&(_=string_get_cycle_count(s,t));do{e.reg8[reg_al]=e.read8(a),a+=s,t=0!=--r}while(t&&_--);e.add_reg_asize(reg_esi,s*(i-r)|0),e.set_ecx_asize(r),e.timestamp_counter+=i-r,t&&(e.instruction_pointer=e.previous_ip)}else e.reg8[reg_al]=e.safe_read8(t),e.add_reg_asize(reg_esi,s);e.diverged()}function lodsw(e){var t=e.get_seg_prefix(reg_ds)+e.get_reg_asize(reg_esi)|0,s=e.flags&flag_direction?-2:2;if(e.prefixes&PREFIX_MASK_REP){if(0==e.get_reg_asize(reg_ecx)>>>0)return;var r=MAX_COUNT_PER_CYCLE;do{e.reg16[reg_ax]=e.safe_read16(t),t+=s,e.add_reg_asize(reg_esi,s);var i=0!==e.decr_ecx_asize()}while(i&&r--);i&&(e.instruction_pointer=e.previous_ip)}else e.reg16[reg_ax]=e.safe_read16(t),e.add_reg_asize(reg_esi,s);e.diverged()}function lodsd(e){var t=e.get_seg_prefix(reg_ds)+e.get_reg_asize(reg_esi)|0,s=e.flags&flag_direction?-4:4;if(e.prefixes&PREFIX_MASK_REP){if(0==e.get_reg_asize(reg_ecx)>>>0)return;var r=MAX_COUNT_PER_CYCLE;do{e.reg32s[reg_eax]=e.safe_read32s(t),t+=s,e.add_reg_asize(reg_esi,s);var i=0!==e.decr_ecx_asize()}while(i&&r--);i&&(e.instruction_pointer=e.previous_ip)}else e.reg32s[reg_eax]=e.safe_read32s(t),e.add_reg_asize(reg_esi,s);e.diverged()}function scasb(e){var t=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,s=e.flags&flag_direction?-1:1,r=e.reg8[reg_al];if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=(e.prefixes&PREFIX_MASK_REP)===PREFIX_REPZ,o=MAX_COUNT_PER_CYCLE,n=e.translate_address_read(t);e.paging&&(o=string_get_cycle_count(s,t));do{t=e.read8(n),n+=s;var d=0!=--i&&r===t===a}while(d&&o--);e.add_reg_asize(reg_edi,s*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i,d&&(e.instruction_pointer=e.previous_ip)}else t=e.safe_read8(t),e.add_reg_asize(reg_edi,s);e.cmp8(r,t),e.diverged()}function scasw(e){var t=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,s=e.flags&flag_direction?-2:2,r=e.reg16[reg_al];if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=(e.prefixes&PREFIX_MASK_REP)===PREFIX_REPZ,o=MAX_COUNT_PER_CYCLE;if(1&t)do{var n=e.safe_read16(t);t+=s,e.add_reg_asize(reg_edi,s);var d=0!==e.decr_ecx_asize()&&r===n===a}while(d&&o--);else{var h=0>s?-1:1,g=e.translate_address_read(t)>>>1;e.paging&&(o=string_get_cycle_count(s,t));do{n=e.read_aligned16(g),g+=h,d=0!=--i&&r===n===a}while(d&&o--);e.add_reg_asize(reg_edi,s*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i}d&&(e.instruction_pointer=e.previous_ip)}else n=e.safe_read16(t),e.add_reg_asize(reg_edi,s);e.cmp16(r,n),e.diverged()}function scasd(e){var t=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,s=e.flags&flag_direction?-4:4,r=e.reg32s[reg_eax];if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=(e.prefixes&PREFIX_MASK_REP)===PREFIX_REPZ,o=MAX_COUNT_PER_CYCLE;if(3&t)do{var n=e.safe_read32s(t);t+=s,e.add_reg_asize(reg_edi,s);var d=0!==e.decr_ecx_asize()&&r===n===a}while(d&&o--);else{var h=0>s?-1:1,g=e.translate_address_read(t)>>>2;e.paging&&(o=string_get_cycle_count(s,t));do{n=e.read_aligned32(g),g+=h,d=0!=--i&&r===n===a}while(d&&o--);e.add_reg_asize(reg_edi,s*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i}d&&(e.instruction_pointer=e.previous_ip)}else n=e.safe_read32s(t),e.add_reg_asize(reg_edi,s);e.cmp32(r,n),e.diverged()}function insb(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,1);var s=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,r=e.flags&flag_direction?-1:1;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=MAX_COUNT_PER_CYCLE,o=e.translate_address_write(s);e.paging&&(a=string_get_cycle_count(r,s));do{e.write8(o,e.io.port_read8(t)),o+=r,s=0!=--i}while(s&&a--);e.add_reg_asize(reg_edi,r*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i,s&&(e.instruction_pointer=e.previous_ip)}else e.writable_or_pagefault(s,1),e.safe_write8(s,e.io.port_read8(t)),e.add_reg_asize(reg_edi,r);e.diverged()}function insw(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,2);var s=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,r=e.flags&flag_direction?-2:2;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=MAX_COUNT_PER_CYCLE;if(1&s)do{e.safe_write16(s,e.io.port_read16(t)),s+=r,e.add_reg_asize(reg_edi,r);var o=0!==e.decr_ecx_asize()}while(o&&a--);else{var n=0>r?-1:1,d=e.translate_address_write(s)>>>1;e.paging&&(a=string_get_cycle_count(r,s));do{e.write_aligned16(d,e.io.port_read16(t)),d+=n,o=0!=--i}while(o&&a--);e.add_reg_asize(reg_edi,r*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i}o&&(e.instruction_pointer=e.previous_ip)}else e.writable_or_pagefault(s,2),e.safe_write16(s,e.io.port_read16(t)),e.add_reg_asize(reg_edi,r);e.diverged()}function insd(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,4);var s=e.get_seg(reg_es)+e.get_reg_asize(reg_edi)|0,r=e.flags&flag_direction?-4:4;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=MAX_COUNT_PER_CYCLE;if(3&s)do{e.safe_write32(s,e.io.port_read32(t)),s+=r,e.add_reg_asize(reg_edi,r);var o=0!==e.decr_ecx_asize()}while(o&&a--);else{var n=0>r?-1:1,d=e.translate_address_write(s)>>>2;e.paging&&(a=string_get_cycle_count(r,s));do{e.write_aligned32(d,e.io.port_read32(t)),d+=n,o=0!=--i}while(o&&a--);e.add_reg_asize(reg_edi,r*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i}o&&(e.instruction_pointer=e.previous_ip)}else e.writable_or_pagefault(s,4),e.safe_write32(s,e.io.port_read32(t)),e.add_reg_asize(reg_edi,r);e.diverged()}function outsb(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,1);var s=e.get_seg_prefix(reg_ds)+e.get_reg_asize(reg_esi)|0,r=e.flags&flag_direction?-1:1;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=MAX_COUNT_PER_CYCLE,o=e.translate_address_read(s);e.paging&&(a=string_get_cycle_count(r,s));do{e.io.port_write8(t,e.read8(o)),o+=r,s=0!=--i}while(s&&a--);e.add_reg_asize(reg_esi,r*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i,s&&(e.instruction_pointer=e.previous_ip)}else e.io.port_write8(t,e.safe_read8(s)),e.add_reg_asize(reg_esi,r);e.diverged()}function outsw(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,2);var s=e.get_seg_prefix(reg_ds)+e.get_reg_asize(reg_esi)|0,r=e.flags&flag_direction?-2:2;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=MAX_COUNT_PER_CYCLE;if(1&s)do{e.io.port_write16(t,e.safe_read16(s)),s+=r,e.add_reg_asize(reg_esi,r);var o=0!==e.decr_ecx_asize()}while(o&&a--);else{var n=0>r?-1:1,d=e.translate_address_read(s)>>>1;e.paging&&(a=string_get_cycle_count(r,s));do{e.io.port_write16(t,e.read_aligned16(d)),d+=n,o=0!=--i}while(o&&a--);e.add_reg_asize(reg_esi,r*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i}o&&(e.instruction_pointer=e.previous_ip)}else e.io.port_write16(t,e.safe_read16(s)),e.add_reg_asize(reg_esi,r);e.diverged()}function outsd(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,4);var s=e.get_seg_prefix(reg_ds)+e.get_reg_asize(reg_esi)|0,r=e.flags&flag_direction?-4:4;if(e.prefixes&PREFIX_MASK_REP){var i=e.get_reg_asize(reg_ecx)>>>0;if(0===i)return;var _=i,a=MAX_COUNT_PER_CYCLE;if(3&s)do{e.io.port_write32(t,e.safe_read32s(s)),s+=r,e.add_reg_asize(reg_esi,r);var o=0!==e.decr_ecx_asize()}while(o&&a--);else{var n=0>r?-1:1,d=e.translate_address_read(s)>>>2;e.paging&&(a=string_get_cycle_count(r,s));do{e.io.port_write32(t,e.read_aligned32(d)),d+=n,o=0!=--i}while(o&&a--);e.add_reg_asize(reg_esi,r*(_-i)|0),e.set_ecx_asize(i),e.timestamp_counter+=_-i}o&&(e.instruction_pointer=e.previous_ip)}else e.io.port_write32(t,e.safe_read32s(s)),e.add_reg_asize(reg_esi,r);e.diverged()}function create_struct(e){return e.map(function(e){var t=Object.keys(e);return console.assert(1===t.length),t=t[0],e=e[t],console.assert(0<e.size),{name:t,type:e,size:e.size,get:e.get,set:e.set}})}function read_elf(e){var t=new DataView(e),s=$jscomp.makeIterator(read_struct(t,Header));if(e=s.next().value,s=s.next().value,console.assert(52===s),DEBUG){for(var r in e)console.log(r+": 0x"+e[r].toString(16));console.log(e)}if(console.assert(e.magic===ELF_MAGIC,"Bad magic"),console.assert(1===e.class,"Unimplemented: 64 bit elf"),console.assert(1===e.data,"Unimplemented: big endian"),console.assert(1===e.version0,"Bad version0"),console.assert(2===e.type,"Unimplemented type"),console.assert(1===e.version1,"Bad version1"),console.assert(52===e.ehsize,"Bad header size"),console.assert(32===e.phentsize,"Bad program header size"),console.assert(40===e.shentsize,"Bad section header size"),s=$jscomp.makeIterator(read_structs(view_slice(t,e.phoff,e.phentsize*e.phnum),ProgramHeader,e.phnum)),r=s.next().value,s.next(),s=$jscomp.makeIterator(read_structs(view_slice(t,e.shoff,e.shentsize*e.shnum),SectionHeader,e.shnum)),t=s.next().value,s.next(),DEBUG){console.log("%d program headers:",r.length),s=$jscomp.makeIterator(r);for(var i=s.next();!i.done;i=s.next())i=i.value,console.log("type=%s offset=%s vaddr=%s paddr=%s filesz=%s memsz=%s flags=%s align=%s",i.type.toString(16),i.offset.toString(16),i.vaddr.toString(16),i.paddr.toString(16),i.filesz.toString(16),i.memsz.toString(16),i.flags.toString(16),i.align.toString(16));for(console.log("%d program headers:",t.length),s=$jscomp.makeIterator(t),i=s.next();!i.done;i=s.next())i=i.value,console.log("name=%s type=%s flags=%s addr=%s offset=%s size=%s link=%s info=%s addralign=%s entsize=%s",i.name.toString(16),i.type.toString(16),i.flags.toString(16),i.addr.toString(16),i.offset.toString(16),i.size.toString(16),i.link.toString(16),i.info.toString(16),i.addralign.toString(16),i.entsize.toString(16))}return{header:e,program_headers:r,sections_headers:t}}function read_struct(e,t){var s={},r=0;t=$jscomp.makeIterator(t);for(var i=t.next();!i.done;i=t.next()){i=i.value;var _=i.get.call(e,r,!0);console.assert(void 0===s[i.name]),s[i.name]=_,r+=i.size}return[s,r]}function read_structs(e,t,s){for(var r=[],i=0,_=0;_<s;_++){var a=$jscomp.makeIterator(read_struct(view_slice(e,i),t)),o=a.next().value;a=a.next().value,r.push(o),i+=a}return[r,i]}function view_slice(e,t,s){return new DataView(e.buffer,e.byteOffset+t,s)}function KeyboardAdapter(e){function t(e){return i(e,!1)}function s(e){return i(e,!0)}function r(e){e=Object.keys(o);for(var t,s=0;s<e.length;s++)t=+e[s],o[t]&&_(t,!1);o={}}function i(e,t){if(n.bus&&(e.shiftKey&&e.ctrlKey&&(74===e.keyCode||75===e.keyCode)||!n.emu_enabled?0:e.target?"phone_keyboard"===e.target.className||"INPUT"!==e.target.nodeName&&"TEXTAREA"!==e.target.nodeName:1)){e:{if(void 0!==e.code){var s=c[e.code];if(void 0!==s)break e}s=d[e.keyCode]}if(s)return _(s,t),e.preventDefault&&e.preventDefault(),!1;console.log("Missing char in map: "+e.keyCode.toString(16))}}function _(e,t){if(t)o[e]&&_(e,!1);else if(!o[e])return;(o[e]=t)||(e|=128),255<e?(a(e>>8),a(255&e)):a(e)}function a(e){n.bus.send("keyboard-code",e)}var o={},n=this;this.emu_enabled=!0;var d=new Uint16Array([0,0,0,0,0,0,0,0,14,15,0,0,0,28,0,0,42,29,56,0,58,0,0,0,0,0,0,1,0,0,0,0,57,57417,57425,57423,57415,57419,57416,57421,80,0,0,0,0,82,83,0,11,2,3,4,5,6,7,8,9,10,0,39,0,13,0,0,0,30,48,46,32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,57435,57436,57437,0,0,82,79,80,81,75,76,77,71,72,73,0,0,0,0,0,0,59,60,61,62,63,64,65,66,67,68,87,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,39,13,51,12,52,53,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,43,27,40,0,57435,57400,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),h={10:13,32:32,39:222,44:188,45:189,46:190,47:191,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,59:186,61:187,91:219,92:220,93:221,96:192,97:65,98:66,99:67,100:68,101:69,102:70,103:71,104:72,105:73,106:74,107:75,108:76,109:77,110:78,111:79,112:80,113:81,114:82,115:83,116:84,117:85,118:86,119:87,120:88,121:89,122:90},g={33:49,34:222,35:51,36:52,37:53,38:55,40:57,41:48,42:56,43:187,58:186,60:188,62:190,63:191,64:50,65:65,66:66,67:67,68:68,69:69,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,82:82,83:83,84:84,85:85,86:86,87:87,88:88,89:89,90:90,94:54,95:189,123:219,124:220,125:221,126:192},c={Escape:1,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10,Digit0:11,Minus:12,Equal:13,Backspace:14,Tab:15,KeyQ:16,KeyW:17,KeyE:18,KeyR:19,KeyT:20,KeyY:21,KeyU:22,KeyI:23,KeyO:24,KeyP:25,BracketLeft:26,BracketRight:27,Enter:28,ControlLeft:29,KeyA:30,KeyS:31,KeyD:32,KeyF:33,KeyG:34,KeyH:35,KeyJ:36,KeyK:37,KeyL:38,Semicolon:39,Quote:40,Backquote:41,ShiftLeft:42,Backslash:43,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Comma:51,Period:52,Slash:53,ShiftRight:54,NumpadMultiply:55,AltLeft:56,Space:57,CapsLock:58,F1:59,F2:60,F3:61,F4:62,F5:63,F6:64,F7:65,F8:66,F9:67,F10:68,NumLock:69,ScrollLock:70,Numpad7:71,Numpad8:72,Numpad9:73,NumpadSubtract:74,Numpad4:75,Numpad5:76,Numpad6:77,NumpadAdd:78,Numpad1:79,Numpad2:80,Numpad3:81,Numpad0:82,NumpadDecimal:83,IntlBackslash:86,F11:87,F12:88,NumpadEnter:57372,ControlRight:57373,NumpadDivide:57397,AltRight:57400,Home:57423,ArrowUp:57416,PageUp:57417,ArrowLeft:57419,ArrowRight:57421,End:57423,ArrowDown:57424,PageDown:57425,Insert:57426,Delete:57427,OSLeft:57435,OSRight:57436,ContextMenu:57437};this.bus=e,this.destroy=function(){"undefined"!=typeof window&&(window.removeEventListener("keyup",t,!1),window.removeEventListener("keydown",s,!1),window.removeEventListener("blur",r,!1))},this.init=function(){"undefined"!=typeof window&&(this.destroy(),window.addEventListener("keyup",t,!1),window.addEventListener("keydown",s,!1),window.addEventListener("blur",r,!1))},this.init(),this.simulate_press=function(e){e={keyCode:e},i(e,!0),i(e,!1)},this.simulate_char=function(e){var t=e.charCodeAt(0);t in h?this.simulate_press(h[t]):t in g?(a(SHIFT_SCAN_CODE),this.simulate_press(g[t]),a(SHIFT_SCAN_CODE|SCAN_CODE_RELEASE)):console.log("ascii -> keyCode not found: ",t,e)}}function MouseAdapter(e,t){function s(e){if(!l.enabled||!l.emu_enabled)return!1;if("mousemove"===e.type||"touchmove"===e.type)return!0;if("mousewheel"===e.type||"DOMMouseScroll"===e.type){var s=t||document.body;e:{for(e=e.target;e.parentNode;){if(e===s){s=!0;break e}e=e.parentNode}s=!1}return s}return!e.target||"INPUT"!==e.target.nodeName&&"TEXTAREA"!==e.target.nodeName}function r(e){s(e)&&(e=e.changedTouches)&&e.length&&(e=e[e.length-1],p=e.clientX,u=e.clientY)}function i(e){(h||c||g)&&(l.bus.send("mouse-click",[!1,!1,!1]),h=c=g=!1)}function _(e){if(l.bus&&s(e)){var r=0,i=0,_=e.changedTouches;_?_.length&&(_=_[_.length-1],r=_.clientX-p,i=_.clientY-u,p=_.clientX,u=_.clientY,e.preventDefault()):"number"==typeof e.movementX?(r=e.movementX,i=e.movementY):"number"==typeof e.webkitMovementX?(r=e.webkitMovementX,i=e.webkitMovementY):"number"==typeof e.mozMovementX?(r=e.mozMovementX,i=e.mozMovementY):(r=e.clientX-p,i=e.clientY-u,p=e.clientX,u=e.clientY),l.bus.send("mouse-delta",[.15*r,-.15*i]),l.bus.send("mouse-absolute",[e.pageX-t.offsetLeft,e.pageY-t.offsetTop,t.offsetWidth,t.offsetHeight])}}function a(e){s(e)&&n(e,!0)}function o(e){s(e)&&n(e,!1)}function n(e,t){l.bus&&(1===e.which?h=t:2===e.which?c=t:3===e.which?g=t:console.log("Unknown event.which: "+e.which),l.bus.send("mouse-click",[h,c,g]))}function d(e){if(s(e)){var t=e.wheelDelta||-e.detail;0>t?t=-1:0<t&&(t=1),l.bus.send("mouse-wheel",[t,0]),e.preventDefault()}}var h=!1,g=!1,c=!1,p=0,u=0,l=this;this.enabled=!1,this.emu_enabled=!0,this.bus=e,this.bus.register("mouse-enable",function(e){this.enabled=e},this),this.destroy=function(){window.removeEventListener("touchstart",r,!1),window.removeEventListener("touchend",i,!1),window.removeEventListener("touchmove",_,!1),window.removeEventListener("mousemove",_,!1),window.removeEventListener("mousedown",a,!1),window.removeEventListener("mouseup",o,!1),window.removeEventListener("DOMMouseScroll",d,!1),window.removeEventListener("mousewheel",d,!1)},this.init=function(){"undefined"!=typeof window&&(this.destroy(),window.addEventListener("touchstart",r,!1),window.addEventListener("touchend",i,!1),window.addEventListener("touchmove",_,!1),window.addEventListener("mousemove",_,!1),window.addEventListener("mousedown",a,!1),window.addEventListener("mouseup",o,!1),window.addEventListener("DOMMouseScroll",d,!1),window.addEventListener("mousewheel",d,!1))},this.init()}function SpeakerAdapter(e){var t=this;"undefined"!=typeof window&&(window.AudioContext||window.webkitAudioContext?(this.bus=e,this.audio_context=new(window.AudioContext||window.webkitAudioContext),this.beep_gain=this.audio_context.createGain(),this.beep_gain.gain.setValueAtTime(0,this.audio_context.currentTime),this.beep_gain.connect(this.audio_context.destination),this.beep_oscillator=this.audio_context.createOscillator(),this.beep_oscillator.type="square",this.beep_oscillator.frequency.setValueAtTime(440,this.audio_context.currentTime),this.beep_oscillator.connect(this.beep_gain),this.beep_oscillator.start(),this.beep_enable=this.beep_playing=!1,this.beep_frequency=440,this.pit_enabled=!1,this.dac_processor=this.audio_context.createScriptProcessor(2048,0,2),this.dac_processor.onaudioprocess=this.dac_process.bind(this),this.dac_processor.connect(this.audio_context.destination),this.dac_buffer0=new Float32Array(this.dac_processor.bufferSize),this.dac_buffer1=new Float32Array(this.dac_processor.bufferSize),this.dac_enabled=!0,e.register("pcspeaker-enable",function(e){this.beep_enable=e,this.beep_update()},this),e.register("pcspeaker-update",function(e){var t=e[1];this.pit_enabled=3==e[0],this.beep_frequency=1e3*OSCILLATOR_FREQ/t,this.beep_update()},this),e.register("speaker-update-data",function(e){this.dac_buffer0=e[0],this.dac_buffer1=e[1]},this),e.register("speaker-request-samplerate",function(){e.send("speaker-tell-samplerate",this.audio_context.sampleRate)},this),e.send("speaker-tell-samplerate",this.audio_context.sampleRate),e.register("speaker-update-enable",function(e){this.dac_enabled&&!e?(this.dac_processor.disconnect(this.audio_context.destination),this.dac_enabled=!1):!this.dac_enabled&&e&&(this.dac_processor.connect(this.audio_context.destination),this.dac_enabled=!0)},this),DEBUG&&(this.debug_dac=!1,this.debug_dac_out=[],window.speaker_debug_dac_out=this.debug_dac_out,window.speaker_debug_start=function(){t.debug_dac=!0,setTimeout(function(){t.debug_dac=!1},250)})):console.warn("Web browser doesn't support Web Audio API"))}function SerialAdapter(e,t){function s(e){a.bus&&a.enabled&&(a.send_char(e.which),e.preventDefault())}function r(e){var t=e.which;8===t?(a.send_char(127),e.preventDefault()):9===t&&(a.send_char(9),e.preventDefault())}function i(e){if(a.enabled){for(var t=e.clipboardData.getData("text/plain"),s=0;s<t.length;s++)a.send_char(t.charCodeAt(s));e.preventDefault()}}function _(t){t.target!==e&&e.blur()}var a=this;this.enabled=!0,this.bus=t,this.text="",this.text_new_line=!1,this.last_update=0,this.bus.register("serial0-output-char",function(e){this.show_char(e)},this),this.destroy=function(){e.removeEventListener("keypress",s,!1),e.removeEventListener("keydown",r,!1),e.removeEventListener("paste",i,!1),window.removeEventListener("mousedown",_,!1)},this.init=function(){this.destroy(),e.addEventListener("keypress",s,!1),e.addEventListener("keydown",r,!1),e.addEventListener("paste",i,!1),window.addEventListener("mousedown",_,!1)},this.init(),this.show_char=function(e){"\b"===e?(this.text=this.text.slice(0,-1),this.update()):"\r"!==e&&(this.text+=e,"\n"===e&&(this.text_new_line=!0),this.update())},this.update=function(){var e=this,t=Date.now(),s=t-this.last_update;16>s?void 0===this.update_timer&&(this.update_timer=setTimeout(function(){e.update_timer=void 0;var t=Date.now();dbg_assert(16<=t-e.last_update),e.last_update=t,e.render()},16-s)):(void 0!==this.update_timer&&(clearTimeout(this.update_timer),this.update_timer=void 0),this.last_update=t,this.render())},this.render=function(){e.value=this.text,this.text_new_line&&(this.text_new_line=!1,e.scrollTop=1e9)},this.send_char=function(e){a.bus&&a.bus.send("serial0-input",e)}}function NetworkAdapter(e,t){this.send_data=function(e){},this.bus=t,this.socket=void 0,this.send_queue=[],this.url=e,this.reconnect_interval=1e4,this.last_connect_attempt=Date.now()-this.reconnect_interval,this.send_queue_limit=64,this.bus.register("net0-send",function(e){this.send(e)},this)}function V86Starter(e){function t(e,t){switch(e){case"hda":o.hda=this.disk_images.hda=t;break;case"hdb":o.hdb=this.disk_images.hdb=t;break;case"cdrom":o.cdrom=this.disk_images.cdrom=t;break;case"fda":o.fda=this.disk_images.fda=t;break;case"fdb":o.fdb=this.disk_images.fdb=t;break;case"multiboot":o.multiboot=this.disk_images.multiboot=t;break;case"bios":o.bios=t.buffer;break;case"vga_bios":o.vga_bios=t.buffer;break;case"initial_state":o.initial_state=t.buffer;break;case"fs9p_json":o.fs9p_json=t.buffer;break;default:dbg_assert(!1,e)}}function s(e,t){t&&(t.get&&t.set&&t.load?n.push({name:e,loadable:t}):(t={buffer:t.buffer,async:t.async,url:t.url,size:t.size},"bios"!==e&&"vga_bios"!==e&&"initial_state"!==e&&"multiboot"!==e||(t.async=!1),t.buffer instanceof ArrayBuffer?(t=new SyncBuffer(t.buffer),n.push({name:e,loadable:t})):"undefined"!=typeof File&&t.buffer instanceof File?(void 0===t.async&&(t.async=268435456<=t.buffer.size),t=t.async?new v86util.AsyncFileBuffer(t.buffer):new v86util.SyncFileBuffer(t.buffer),n.push({name:e,loadable:t})):t.url?t.async?(t=new v86util.AsyncXHRBuffer(t.url,t.size),n.push({name:e,loadable:t})):n.push({name:e,url:t.url,size:t.size}):dbg_log("Ignored file: url="+t.url+" buffer="+t.buffer)))}function r(){o.initial_state&&(o.memory_size=0),this.bus.send("cpu-init",o),setTimeout(function(){o.initial_state&&a.restore_state(o.initial_state),setTimeout(function(){o.fs9p&&o.fs9p_json&&o.fs9p.OnJSONLoaded(o.fs9p_json),e.autostart&&this.bus.send("cpu-run")}.bind(this),0)}.bind(this),0)}this.cpu_is_running=!1;var i=Bus.create(),_=this.bus=i[0];this.emulator_bus=i[1];var a=this.v86=new v86(this.emulator_bus);this.bus.register("emulator-stopped",function(){this.cpu_is_running=!1},this),this.bus.register("emulator-started",function(){this.cpu_is_running=!0},this);var o={};this.disk_images={fda:void 0,fdb:void 0,hda:void 0,hdb:void 0,cdrom:void 0},o.load_devices=!0,o.memory_size=e.memory_size||67108864,o.vga_memory_size=e.vga_memory_size||8388608,o.boot_order=e.boot_order||531,o.fastboot=e.fastboot||!1,o.fda=void 0,o.fdb=void 0,e.network_relay_url&&(this.network_adapter=new NetworkAdapter(e.network_relay_url,_),o.enable_ne2k=!0),e.disable_keyboard||(this.keyboard_adapter=new KeyboardAdapter(_)),e.disable_mouse||(this.mouse_adapter=new MouseAdapter(_,e.screen_container)),e.screen_container?this.screen_adapter=new ScreenAdapter(e.screen_container,_):e.screen_dummy&&(this.screen_adapter=new DummyScreenAdapter(_)),e.serial_container&&(this.serial_adapter=new SerialAdapter(e.serial_container,_)),e.disable_speaker||(this.speaker_adapter=new SpeakerAdapter(_));var n=[];for(i="bios vga_bios cdrom hda hdb fda fdb initial_state multiboot".split(" "),_=0;_<i.length;_++)s(i[_],e[i[_]]);if(e.filesystem&&(i=e.filesystem.basefs,_=e.filesystem.baseurl,this.fs9p=new FS(_),o.fs9p=this.fs9p,i)){if(console.assert(_,"Filesystem: baseurl must be specified"),"object"==typeof i){var d=i.size;i=i.url}dbg_assert("string"==typeof i),n.push({name:"fs9p_json",url:i,size:d,as_text:!0})}var h=this,g=n.length,c=function(e){if(e===g)setTimeout(r.bind(this),0);else{var s=n[e];s.loadable?(s.loadable.onload=function(r){t.call(this,s.name,s.loadable),c(e+1)}.bind(this),s.loadable.load()):v86util.load_file(s.url,{done:function(r){t.call(this,s.name,new SyncBuffer(r)),c(e+1)}.bind(this),progress:function(t){200===t.target.status?h.emulator_bus.send("download-progress",{file_index:e,file_count:g,file_name:s.url,lengthComputable:t.lengthComputable,total:t.total||s.size,loaded:t.loaded}):h.emulator_bus.send("download-error",{file_index:e,file_count:g,file_name:s.url,request:t.target})},as_text:s.as_text})}}.bind(this);c(0)}function FileNotFoundError(e){this.message=e||"File not found"}function DummyScreenAdapter(e){var t,s,r,i,_,a,o;this.bus=e,e.register("screen-set-mode",function(e){this.set_mode(e)},this),e.register("screen-fill-buffer-end",function(e){this.update_buffer(e[0],e[1])},this),e.register("screen-put-char",function(e){this.put_char(e[0],e[1],e[2],e[3],e[4])},this),e.register("screen-text-scroll",function(e){console.log("scroll",e)},this),e.register("screen-update-cursor",function(e){this.update_cursor(e[0],e[1])},this),e.register("screen-update-cursor-scanline",function(e){this.update_cursor_scanline(e[0],e[1])},this),e.register("screen-set-size-text",function(e){this.set_size_text(e[0],e[1])},this),e.register("screen-set-size-graphical",function(e){this.set_size_graphical(e[0],e[1])},this),this.put_char=function(e,t,s,r,i){e<o&&t<a&&(e=3*(e*a+t),_[e]=s,_[e+1]=r,_[e+2]=i)},this.destroy=function(){},this.set_mode=function(e){},this.clear_screen=function(){},this.set_size_text=function(e,t){e===a&&t===o||(_=new Int32Array(e*t*3),a=e,o=t)},this.set_size_graphical=function(e,r){t=new Uint8Array(4*e*r),s=new Int32Array(t.buffer),this.bus.send("screen-tell-buffer",[s],[s.buffer])},this.set_scale=function(e,t){},this.update_cursor_scanline=function(e,t){},this.update_cursor=function(e,t){e===r&&t===i||(r=e,i=t)},this.update_buffer=function(e,t){},this.get_text_screen=function(){for(var e=[],t=0;t<o;t++)e.push(this.get_text_row(t));return e},this.get_text_row=function(e){var t="";e=3*e*a;for(var s=0;s<a;s++)t+=String.fromCharCode(_[e+3*s]);return t}}function FS(e){this.inodes=[],this.events=[],this.baseurl=e,this.filesinloadingqueue=this.qidnumber=0,this.OnLoaded=function(){},this.inodedata={},this.total_size=274877906944,this.used_size=0,this.CreateDirectory("",-1)}function Inode(e){this.updatedir=!1,this.nextid=this.firstid=this.parentid=-1,this.status=0,this.name="",this.minor=this.major=this.mtime=this.atime=this.ctime=this.fid=this.gid=this.uid=this.size=0,this.symlink="",this.mode=493,this.qid={type:0,version:0,path:e},this.caps=void 0}function hex8(e){return h(e)}function UTF8StreamToUnicode(){this.stream=new Uint8Array(5),this.ofs=0,this.Put=function(e){switch(this.stream[this.ofs]=e,++this.ofs){case 1:if(128>this.stream[0])return this.ofs=0,this.stream[0];break;case 2:if(192==(224&this.stream[0])&&128==(192&this.stream[1]))return this.ofs=0,(31&this.stream[0])<<6|63&this.stream[1]}return-1}}function UnicodeToUTF8Stream(e){return 128>e?[e]:2048>e?[192|e>>6&31,128|63&e]:void 0}var $jscomp=$jscomp||{};$jscomp.scope={},$jscomp.ASSUME_ES5=!1,$jscomp.ASSUME_NO_NATIVE_MAP=!1,$jscomp.ASSUME_NO_NATIVE_SET=!1,$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(e,t,s){e!=Array.prototype&&e!=Object.prototype&&(e[t]=s.value)},$jscomp.getGlobal=function(e){return"undefined"!=typeof window&&window===e?e:"undefined"!=typeof global&&null!=global?global:e},$jscomp.global=$jscomp.getGlobal(this),$jscomp.SYMBOL_PREFIX="jscomp_symbol_",$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){},$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)},$jscomp.Symbol=function(){var e=0;return function(t){return $jscomp.SYMBOL_PREFIX+(t||"")+e++}}(),$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var e=$jscomp.global.Symbol.iterator;e||(e=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator")),"function"!=typeof Array.prototype[e]&&$jscomp.defineProperty(Array.prototype,e,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}}),$jscomp.initSymbolIterator=function(){}},$jscomp.arrayIterator=function(e){var t=0;return $jscomp.iteratorPrototype(function(){return t<e.length?{done:!1,value:e[t++]}:{done:!0}})},$jscomp.iteratorPrototype=function(e){return $jscomp.initSymbolIterator(),e={next:e},e[$jscomp.global.Symbol.iterator]=function(){return this},e},$jscomp.makeIterator=function(e){$jscomp.initSymbolIterator();var t=e[Symbol.iterator];return t?t.call(e):$jscomp.arrayIterator(e)},$jscomp.polyfill=function(e,t,s,r){if(t){for(s=$jscomp.global,e=e.split("."),r=0;r<e.length-1;r++){var i=e[r];i in s||(s[i]={}),s=s[i]}e=e[e.length-1],r=s[e],t=t(r),t!=r&&null!=t&&$jscomp.defineProperty(s,e,{configurable:!0,writable:!0,value:t})}},$jscomp.polyfill("Math.trunc",function(e){return e||function(e){if(e=Number(e),isNaN(e)||1/0===e||-1/0===e||0===e)return e;var t=Math.floor(Math.abs(e));return 0>e?-t:t}},"es6","es3"),$jscomp.iteratorFromArray=function(e,t){$jscomp.initSymbolIterator(),e instanceof String&&(e+="");var s=0,r={next:function(){if(s<e.length){var i=s++;return{value:t(i,e[i]),done:!1}}return r.next=function(){return{done:!0,value:void 0}},r.next()}};return r[Symbol.iterator]=function(){return r},r},$jscomp.polyfill("Array.prototype.entries",function(e){return e||function(){return $jscomp.iteratorFromArray(this,function(e,t){return[e,t]})}},"es6","es3");var COMPILED=!0,goog=goog||{};goog.global=this,goog.isDef=function(e){return void 0!==e},goog.exportPath_=function(e,t,s){e=e.split("."),s=s||goog.global,e[0]in s||!s.execScript||s.execScript("var "+e[0]);for(var r;e.length&&(r=e.shift());)!e.length&&goog.isDef(t)?s[r]=t:s=s[r]?s[r]:s[r]={}},goog.define=function(e,t){COMPILED||(goog.global.CLOSURE_UNCOMPILED_DEFINES&&Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_UNCOMPILED_DEFINES,e)?t=goog.global.CLOSURE_UNCOMPILED_DEFINES[e]:goog.global.CLOSURE_DEFINES&&Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_DEFINES,e)&&(t=goog.global.CLOSURE_DEFINES[e])),goog.exportPath_(e,t)},goog.DEBUG=!0,goog.LOCALE="en",goog.TRUSTED_SITE=!0,goog.STRICT_MODE_COMPATIBLE=!1,goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG,goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1,goog.provide=function(e){if(!COMPILED&&goog.isProvided_(e))throw Error('Namespace "'+e+'" already declared.');goog.constructNamespace_(e)},goog.constructNamespace_=function(e,t){if(!COMPILED){delete goog.implicitNamespaces_[e];for(var s=e;(s=s.substring(0,s.lastIndexOf(".")))&&!goog.getObjectByName(s);)goog.implicitNamespaces_[s]=!0}goog.exportPath_(e,t)},goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/,goog.module=function(e){if(!goog.isString(e)||!e||-1==e.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInModuleLoader_())throw Error("Module "+e+" has been loaded incorrectly.");if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module.");if(goog.moduleLoaderState_.moduleName=e,!COMPILED){if(goog.isProvided_(e))throw Error('Namespace "'+e+'" already declared.');delete goog.implicitNamespaces_[e]}},goog.module.get=function(e){return goog.module.getInternal_(e)},goog.module.getInternal_=function(e){if(!COMPILED)return goog.isProvided_(e)?e in goog.loadedModules_?goog.loadedModules_[e]:goog.getObjectByName(e):null},goog.moduleLoaderState_=null,goog.isInModuleLoader_=function(){return null!=goog.moduleLoaderState_},goog.module.declareTestMethods=function(){if(!goog.isInModuleLoader_())throw Error("goog.module.declareTestMethods must be called from within a goog.module");goog.moduleLoaderState_.declareTestMethods=!0},goog.module.declareLegacyNamespace=function(){if(!COMPILED&&!goog.isInModuleLoader_())throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module");if(!COMPILED&&!goog.moduleLoaderState_.moduleName)throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace.")
;goog.moduleLoaderState_.declareLegacyNamespace=!0},goog.setTestOnly=function(e){if(goog.DISALLOW_TEST_ONLY_CODE)throw e=e||"",Error("Importing test-only code into non-debug environment"+(e?": "+e:"."))},goog.forwardDeclare=function(e){},COMPILED||(goog.isProvided_=function(e){return e in goog.loadedModules_||!goog.implicitNamespaces_[e]&&goog.isDefAndNotNull(goog.getObjectByName(e))},goog.implicitNamespaces_={"goog.module":!0}),goog.getObjectByName=function(e,t){e=e.split("."),t=t||goog.global;for(var s;s=e.shift();){if(!goog.isDefAndNotNull(t[s]))return null;t=t[s]}return t},goog.globalize=function(e,t){t=t||goog.global;for(var s in e)t[s]=e[s]},goog.addDependency=function(e,t,s,r){if(goog.DEPENDENCIES_ENABLED){var i;e=e.replace(/\\/g,"/");for(var _=goog.dependencies_,a=0;i=t[a];a++)_.nameToPath[i]=e,_.pathIsModule[e]=!!r;for(r=0;t=s[r];r++)e in _.requires||(_.requires[e]={}),_.requires[e][t]=!0}},goog.ENABLE_DEBUG_LOADER=!0,goog.logToConsole_=function(e){goog.global.console&&goog.global.console.error(e)},goog.require=function(e){if(!COMPILED){if(goog.ENABLE_DEBUG_LOADER&&goog.IS_OLD_IE_&&goog.maybeProcessDeferredDep_(e),goog.isProvided_(e))return goog.isInModuleLoader_()?goog.module.getInternal_(e):null;if(goog.ENABLE_DEBUG_LOADER){var t=goog.getPathFromDeps_(e);if(t)return goog.included_[t]=!0,goog.writeScripts_(),null}throw e="goog.require could not find: "+e,goog.logToConsole_(e),Error(e)}},goog.basePath="",goog.nullFunction=function(){},goog.abstractMethod=function(){throw Error("unimplemented abstract method")},goog.addSingletonGetter=function(e){e.getInstance=function(){return e.instance_?e.instance_:(goog.DEBUG&&(goog.instantiatedSingletons_[goog.instantiatedSingletons_.length]=e),e.instance_=new e)}},goog.instantiatedSingletons_=[],goog.LOAD_MODULE_USING_EVAL=!0,goog.SEAL_MODULE_EXPORTS=goog.DEBUG,goog.loadedModules_={},goog.DEPENDENCIES_ENABLED=!COMPILED&&goog.ENABLE_DEBUG_LOADER,goog.DEPENDENCIES_ENABLED&&(goog.included_={},goog.dependencies_={pathIsModule:{},nameToPath:{},requires:{},visited:{},written:{},deferred:{}},goog.inHtmlDocument_=function(){var e=goog.global.document;return void 0!==e&&"write"in e},goog.findBasePath_=function(){if(goog.global.CLOSURE_BASE_PATH)goog.basePath=goog.global.CLOSURE_BASE_PATH;else if(goog.inHtmlDocument_())for(var e=goog.global.document.getElementsByTagName("SCRIPT"),t=e.length-1;0<=t;--t){var s=e[t].src,r=s.lastIndexOf("?");if(r=-1==r?s.length:r,"base.js"==s.substr(r-7,7)){goog.basePath=s.substr(0,r-7);break}}},goog.importScript_=function(e,t){(goog.global.CLOSURE_IMPORT_SCRIPT||goog.writeScriptTag_)(e,t)&&(goog.dependencies_.written[e]=!0)},goog.IS_OLD_IE_=!goog.global.atob&&goog.global.document&&goog.global.document.all,goog.importModule_=function(e){goog.importScript_("",'goog.retrieveAndExecModule_("'+e+'");')&&(goog.dependencies_.written[e]=!0)},goog.queuedModules_=[],goog.wrapModule_=function(e,t){return goog.LOAD_MODULE_USING_EVAL&&goog.isDef(goog.global.JSON)?"goog.loadModule("+goog.global.JSON.stringify(t+"\n//# sourceURL="+e+"\n")+");":'goog.loadModule(function(exports) {"use strict";'+t+"\n;return exports});\n//# sourceURL="+e+"\n"},goog.loadQueuedModules_=function(){var e=goog.queuedModules_.length;if(0<e){var t=goog.queuedModules_;goog.queuedModules_=[];for(var s=0;s<e;s++)goog.maybeProcessDeferredPath_(t[s])}},goog.maybeProcessDeferredDep_=function(e){goog.isDeferredModule_(e)&&goog.allDepsAreAvailable_(e)&&(e=goog.getPathFromDeps_(e),goog.maybeProcessDeferredPath_(goog.basePath+e))},goog.isDeferredModule_=function(e){return!(!(e=goog.getPathFromDeps_(e))||!goog.dependencies_.pathIsModule[e])&&goog.basePath+e in goog.dependencies_.deferred},goog.allDepsAreAvailable_=function(e){if((e=goog.getPathFromDeps_(e))&&e in goog.dependencies_.requires)for(var t in goog.dependencies_.requires[e])if(!goog.isProvided_(t)&&!goog.isDeferredModule_(t))return!1;return!0},goog.maybeProcessDeferredPath_=function(e){if(e in goog.dependencies_.deferred){var t=goog.dependencies_.deferred[e];delete goog.dependencies_.deferred[e],goog.globalEval(t)}},goog.loadModule=function(e){var t=goog.moduleLoaderState_;try{if(goog.moduleLoaderState_={moduleName:void 0,declareTestMethods:!1},goog.isFunction(e))var s=e.call(goog.global,{});else{if(!goog.isString(e))throw Error("Invalid module definition");s=goog.loadModuleFromSource_.call(goog.global,e)}var r=goog.moduleLoaderState_.moduleName;if(!goog.isString(r)||!r)throw Error('Invalid module name "'+r+'"');if(goog.moduleLoaderState_.declareLegacyNamespace?goog.constructNamespace_(r,s):goog.SEAL_MODULE_EXPORTS&&Object.seal&&Object.seal(s),goog.loadedModules_[r]=s,goog.moduleLoaderState_.declareTestMethods)for(var i in s)0!==i.indexOf("test",0)&&"tearDown"!=i&&"setUp"!=i&&"setUpPage"!=i&&"tearDownPage"!=i||(goog.global[i]=s[i])}finally{goog.moduleLoaderState_=t}},goog.loadModuleFromSource_=function(a){return eval(a),{}},goog.writeScriptSrcNode_=function(e){goog.global.document.write('<script type="text/javascript" src="'+e+'"></script>')},goog.appendScriptSrcNode_=function(e){var t=goog.global.document,s=t.createElement("script");s.type="text/javascript",s.src=e,s.defer=!1,s.async=!1,t.head.appendChild(s)},goog.writeScriptTag_=function(e,t){if(goog.inHtmlDocument_()){var s=goog.global.document;if(!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING&&"complete"==s.readyState){if(/\bdeps.js$/.test(e))return!1;throw Error('Cannot write "'+e+'" after document load')}var r=goog.IS_OLD_IE_;return void 0===t?r?(t=" onreadystatechange='goog.onScriptLoad_(this, "+ ++goog.lastNonModuleScriptIndex_+")' ",s.write('<script type="text/javascript" src="'+e+'"'+t+"></script>")):goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING?goog.appendScriptSrcNode_(e):goog.writeScriptSrcNode_(e):s.write('<script type="text/javascript">'+t+"</script>"),!0}return!1},goog.lastNonModuleScriptIndex_=0,goog.onScriptLoad_=function(e,t){return"complete"==e.readyState&&goog.lastNonModuleScriptIndex_==t&&goog.loadQueuedModules_(),!0},goog.writeScripts_=function(){function e(i){if(!(i in r.written)){if(!(i in r.visited)&&(r.visited[i]=!0,i in r.requires))for(var _ in r.requires[i])if(!goog.isProvided_(_)){if(!(_ in r.nameToPath))throw Error("Undefined nameToPath for "+_);e(r.nameToPath[_])}i in s||(s[i]=!0,t.push(i))}}var t=[],s={},r=goog.dependencies_;for(_ in goog.included_)r.written[_]||e(_);for(var i=0;i<t.length;i++){var _=t[i];goog.dependencies_.written[_]=!0}var a=goog.moduleLoaderState_;for(goog.moduleLoaderState_=null,i=0;i<t.length;i++){if(!(_=t[i]))throw goog.moduleLoaderState_=a,Error("Undefined script input");r.pathIsModule[_]?goog.importModule_(goog.basePath+_):goog.importScript_(goog.basePath+_)}goog.moduleLoaderState_=a},goog.getPathFromDeps_=function(e){return e in goog.dependencies_.nameToPath?goog.dependencies_.nameToPath[e]:null},goog.findBasePath_(),goog.global.CLOSURE_NO_DEPS||goog.importScript_(goog.basePath+"deps.js")),goog.normalizePath_=function(e){e=e.split("/");for(var t=0;t<e.length;)"."==e[t]?e.splice(t,1):t&&".."==e[t]&&e[t-1]&&".."!=e[t-1]?e.splice(--t,2):t++;return e.join("/")},goog.loadFileSync_=function(e){if(goog.global.CLOSURE_LOAD_FILE_SYNC)return goog.global.CLOSURE_LOAD_FILE_SYNC(e);var t=new goog.global.XMLHttpRequest;return t.open("get",e,!1),t.send(),t.responseText},goog.retrieveAndExecModule_=function(e){if(!COMPILED){var t=e;e=goog.normalizePath_(e);var s=goog.global.CLOSURE_IMPORT_SCRIPT||goog.writeScriptTag_,r=goog.loadFileSync_(e);if(null==r)throw Error("load of "+e+"failed");r=goog.wrapModule_(e,r),goog.IS_OLD_IE_?(goog.dependencies_.deferred[t]=r,goog.queuedModules_.push(t)):s(e,r)}},goog.typeOf=function(e){var t=typeof e;if("object"==t){if(!e)return"null";if(e instanceof Array)return"array";if(e instanceof Object)return t;var s=Object.prototype.toString.call(e);if("[object Window]"==s)return"object";if("[object Array]"==s||"number"==typeof e.length&&void 0!==e.splice&&void 0!==e.propertyIsEnumerable&&!e.propertyIsEnumerable("splice"))return"array";if("[object Function]"==s||void 0!==e.call&&void 0!==e.propertyIsEnumerable&&!e.propertyIsEnumerable("call"))return"function"}else if("function"==t&&void 0===e.call)return"object";return t},goog.isNull=function(e){return null===e},goog.isDefAndNotNull=function(e){return null!=e},goog.isArray=function(e){return"array"==goog.typeOf(e)},goog.isArrayLike=function(e){var t=goog.typeOf(e);return"array"==t||"object"==t&&"number"==typeof e.length},goog.isDateLike=function(e){return goog.isObject(e)&&"function"==typeof e.getFullYear},goog.isString=function(e){return"string"==typeof e},goog.isBoolean=function(e){return"boolean"==typeof e},goog.isNumber=function(e){return"number"==typeof e},goog.isFunction=function(e){return"function"==goog.typeOf(e)},goog.isObject=function(e){var t=typeof e;return"object"==t&&null!=e||"function"==t},goog.getUid=function(e){return e[goog.UID_PROPERTY_]||(e[goog.UID_PROPERTY_]=++goog.uidCounter_)},goog.hasUid=function(e){return!!e[goog.UID_PROPERTY_]},goog.removeUid=function(e){"removeAttribute"in e&&e.removeAttribute(goog.UID_PROPERTY_);try{delete e[goog.UID_PROPERTY_]}catch(e){}},goog.UID_PROPERTY_="closure_uid_"+(1e9*Math.random()>>>0),goog.uidCounter_=0,goog.getHashCode=goog.getUid,goog.removeHashCode=goog.removeUid,goog.cloneObject=function(e){var t=goog.typeOf(e);if("object"==t||"array"==t){if(e.clone)return e.clone();t="array"==t?[]:{};for(var s in e)t[s]=goog.cloneObject(e[s]);return t}return e},goog.bindNative_=function(e,t,s){return e.call.apply(e.bind,arguments)},goog.bindJs_=function(e,t,s){if(!e)throw Error();if(2<arguments.length){var r=Array.prototype.slice.call(arguments,2);return function(){var s=Array.prototype.slice.call(arguments);return Array.prototype.unshift.apply(s,r),e.apply(t,s)}}return function(){return e.apply(t,arguments)}},goog.bind=function(e,t,s){return Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?goog.bind=goog.bindNative_:goog.bind=goog.bindJs_,goog.bind.apply(null,arguments)},goog.partial=function(e,t){var s=Array.prototype.slice.call(arguments,1);return function(){var t=s.slice();return t.push.apply(t,arguments),e.apply(this,t)}},goog.mixin=function(e,t){for(var s in t)e[s]=t[s]},goog.now=goog.TRUSTED_SITE&&Date.now||function(){return+new Date},goog.globalEval=function(e){if(goog.global.execScript)goog.global.execScript(e,"JavaScript");else{if(!goog.global.eval)throw Error("goog.globalEval not available");if(null==goog.evalWorksForGlobals_&&(goog.global.eval("var _et_ = 1;"),void 0!==goog.global._et_?(delete goog.global._et_,goog.evalWorksForGlobals_=!0):goog.evalWorksForGlobals_=!1),goog.evalWorksForGlobals_)goog.global.eval(e);else{var t=goog.global.document,s=t.createElement("SCRIPT");s.type="text/javascript",s.defer=!1,s.appendChild(t.createTextNode(e)),t.body.appendChild(s),t.body.removeChild(s)}}},goog.evalWorksForGlobals_=null,goog.getCssName=function(e,t){var s=function(e){return goog.cssNameMapping_[e]||e},r=function(e){e=e.split("-");for(var t=[],r=0;r<e.length;r++)t.push(s(e[r]));return t.join("-")};return r=goog.cssNameMapping_?"BY_WHOLE"==goog.cssNameMappingStyle_?s:r:function(e){return e},t?e+"-"+r(t):r(e)},goog.setCssNameMapping=function(e,t){goog.cssNameMapping_=e,goog.cssNameMappingStyle_=t},!COMPILED&&goog.global.CLOSURE_CSS_NAME_MAPPING&&(goog.cssNameMapping_=goog.global.CLOSURE_CSS_NAME_MAPPING),goog.getMsg=function(e,t){return t&&(e=e.replace(/\{\$([^}]+)}/g,function(e,s){return s in t?t[s]:e})),e},goog.getMsgWithFallback=function(e,t){return e},goog.exportSymbol=function(e,t,s){goog.exportPath_(e,t,s)},goog.exportProperty=function(e,t,s){e[t]=s},goog.inherits=function(e,t){function s(){}s.prototype=t.prototype,e.superClass_=t.prototype,e.prototype=new s,e.prototype.constructor=e,e.base=function(e,s,r){for(var i=Array(arguments.length-2),_=2;_<arguments.length;_++)i[_-2]=arguments[_];return t.prototype[s].apply(e,i)}},goog.base=function(e,t,s){var r=arguments.callee.caller;if(goog.STRICT_MODE_COMPATIBLE||goog.DEBUG&&!r)throw Error("arguments.caller not defined. goog.base() cannot be used with strict mode code. See http://www.ecma-international.org/ecma-262/5.1/#sec-C");if(r.superClass_){for(var i=Array(arguments.length-1),_=1;_<arguments.length;_++)i[_-1]=arguments[_];return r.superClass_.constructor.apply(e,i)}for(i=Array(arguments.length-2),_=2;_<arguments.length;_++)i[_-2]=arguments[_];_=!1;for(var a=e.constructor;a;a=a.superClass_&&a.superClass_.constructor)if(a.prototype[t]===r)_=!0;else if(_)return a.prototype[t].apply(e,i);if(e[t]===r)return e.constructor.prototype[t].apply(e,i);throw Error("goog.base called from a method of one name to a method of a different name")},goog.scope=function(e){e.call(goog.global)},COMPILED||(goog.global.COMPILED=COMPILED),goog.defineClass=function(e,t){var s=t.constructor,r=t.statics;return s&&s!=Object.prototype.constructor||(s=function(){throw Error("cannot instantiate an interface (no constructor defined).")}),s=goog.defineClass.createSealingConstructor_(s,e),e&&goog.inherits(s,e),delete t.constructor,delete t.statics,goog.defineClass.applyProperties_(s.prototype,t),null!=r&&(r instanceof Function?r(s):goog.defineClass.applyProperties_(s,r)),s},goog.defineClass.SEAL_CLASS_INSTANCES=goog.DEBUG,goog.defineClass.createSealingConstructor_=function(e,t){if(goog.defineClass.SEAL_CLASS_INSTANCES&&Object.seal instanceof Function){if(t&&t.prototype&&t.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_])return e;var s=function(){var t=e.apply(this,arguments)||this;return t[goog.UID_PROPERTY_]=t[goog.UID_PROPERTY_],this.constructor===s&&Object.seal(t),t};return s}return e},goog.defineClass.OBJECT_PROTOTYPE_FIELDS_="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),goog.defineClass.applyProperties_=function(e,t){for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s]);for(var r=0;r<goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length;r++)s=goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[r],Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s])},goog.tagUnsealableClass=function(e){!COMPILED&&goog.defineClass.SEAL_CLASS_INSTANCES&&(e.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_]=!0)},goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_="goog_defineClass_legacy_unsealable";var LOG_ALL=-1,LOG_NONE=0,LOG_OTHER=1,LOG_CPU=2,LOG_FPU=4,LOG_MEM=8,LOG_DMA=16,LOG_IO=32,LOG_PS2=64,LOG_PIC=128,LOG_VGA=256,LOG_PIT=512,LOG_MOUSE=1024,LOG_PCI=2048,LOG_BIOS=4096,LOG_FLOPPY=8192,LOG_SERIAL=16384,LOG_DISK=32768,LOG_RTC=65536,LOG_HPET=131072,LOG_ACPI=262144,LOG_APIC=524288,LOG_NET=1048576,LOG_VIRTIO=2097152,LOG_9P=4194304,LOG_SB16=8388608,LOG_NAMES=[[1,""],[LOG_CPU,"CPU"],[LOG_DISK,"DISK"],[LOG_FPU,"FPU"],[LOG_MEM,"MEM"],[LOG_DMA,"DMA"],[LOG_IO,"IO"],[LOG_PS2,"PS2"],[LOG_PIC,"PIC"],[LOG_VGA,"VGA"],[LOG_PIT,"PIT"],[LOG_MOUSE,"MOUS"],[LOG_PCI,"PCI"],[LOG_BIOS,"BIOS"],[LOG_FLOPPY,"FLOP"],[LOG_SERIAL,"SERI"],[LOG_RTC,"RTC"],[LOG_HPET,"HPET"],[LOG_ACPI,"ACPI"],[LOG_APIC,"APIC"],[LOG_NET,"NET"],[LOG_VIRTIO,"VIO"],[LOG_9P,"9P"],[LOG_SB16,"SB16"]],TLB_SYSTEM_READ=1,TLB_SYSTEM_WRITE=2,TLB_USER_READ=4,TLB_USER_WRITE=8,flag_carry=1,flag_parity=4,flag_adjust=16,flag_zero=64,flag_sign=128,flag_trap=256,flag_interrupt=512,flag_direction=1024,flag_overflow=2048,flag_iopl=12288,flag_nt=16384,flag_rf=65536,flag_vm=131072,flag_ac=262144,flag_vif=524288,flag_vip=1048576,flag_id=2097152,flags_default=2,flags_mask=flag_carry|flag_parity|flag_adjust|flag_zero|flag_sign|flag_trap|flag_interrupt|flag_direction|flag_overflow|flag_iopl|flag_nt|flag_rf|flag_vm|flag_ac|flag_vif|flag_vip|flag_id,flags_all=flag_carry|flag_parity|flag_adjust|flag_zero|flag_sign|flag_overflow,OPSIZE_8=7,OPSIZE_16=15,OPSIZE_32=31,PSE_ENABLED=128,reg_eax=0,reg_ecx=1,reg_edx=2,reg_ebx=3,reg_esp=4,reg_ebp=5,reg_esi=6,reg_edi=7,reg_ax=0,reg_cx=2,reg_dx=4,reg_bx=6,reg_sp=8,reg_bp=10,reg_si=12,reg_di=14,reg_al=0,reg_cl=4,reg_dl=8,reg_bl=12,reg_ah=1,reg_ch=5,reg_dh=9,reg_bh=13,reg_es=0,reg_cs=1,reg_ss=2,reg_ds=3,reg_fs=4,reg_gs=5,reg_tr=6,reg_ldtr=7,MMAP_BLOCK_BITS=17,MMAP_BLOCK_SIZE=1<<MMAP_BLOCK_BITS,MEM_PAGE_WRITTEN=1,MAGIC_CPU_EXCEPTION=233495534,REPEAT_STRING_PREFIX_NONE=0,REPEAT_STRING_PREFIX_NZ=1,REPEAT_STRING_PREFIX_Z=2,CR0_PE=1,CR0_MP=2,CR0_EM=4,CR0_TS=8,CR0_ET=16,CR0_WP=65536,CR0_NW=536870912,CR0_CD=1073741824,CR0_PG=-2147483648,CR4_VME=1,CR4_PVI=2,CR4_TSD=4,CR4_PSE=16,CR4_DE=8,CR4_PAE=32,CR4_PGE=128,CR4_OSFXSR=512,CR4_OSXMMEXCPT=1024,SEG_PREFIX_NONE=-1,SEG_PREFIX_ZERO=7,IA32_SYSENTER_CS=372,IA32_SYSENTER_ESP=373,IA32_SYSENTER_EIP=374,IA32_TIME_STAMP_COUNTER=16,IA32_PLATFORM_ID=23,MSR_EBC_FREQUENCY_ID=44,IA32_APIC_BASE_MSR=27,IA32_BIOS_SIGN_ID=139,IA32_MISC_ENABLE=416,IA32_RTIT_CTL=1392,MSR_SMI_COUNT=52,IA32_MCG_CAP=377,IA32_KERNEL_GS_BASE=-1073741567,MSR_PKG_C2_RESIDENCY=1549,IA32_APIC_BASE_BSP=256,IA32_APIC_BASE_EXTD=1024,IA32_APIC_BASE_EN=2048,TSR_BACKLINK=0,TSR_CR3=28,TSR_EIP=32,TSR_EFLAGS=36,TSR_EAX=40,TSR_ECX=44,TSR_EDX=48,TSR_EBX=52,TSR_ESP=56,TSR_EBP=60,TSR_ESI=64,TSR_EDI=68,TSR_ES=72,TSR_CS=76,TSR_SS=80,TSR_DS=84,TSR_FS=88,TSR_GS=92,TSR_LDT=96,FW_CFG_SIGNATURE=0,FW_CFG_RAM_SIZE=3,FW_CFG_NB_CPUS=5,PREFIX_MASK_REP=24,PREFIX_REPZ=8,PREFIX_REPNZ=16,PREFIX_MASK_SEGMENT=7,PREFIX_MASK_OPSIZE=32,PREFIX_MASK_ADDRSIZE=64,PREFIX_F2=PREFIX_REPNZ,PREFIX_F3=PREFIX_REPZ,PREFIX_66=PREFIX_MASK_OPSIZE,MXCSR_MASK=65471;"undefined"==typeof window||window.requestAnimationFrame||(window.requestAnimationFrame=window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame);var EPERM=1,ENOENT=2,EINVAL=22,ENOTSUPP=524,EPROTO=71,P9_STAT_MODE_DIR=2147483648,P9_STAT_MODE_APPEND=1073741824,P9_STAT_MODE_EXCL=536870912,P9_STAT_MODE_MOUNT=268435456,P9_STAT_MODE_AUTH=134217728,P9_STAT_MODE_TMP=67108864,P9_STAT_MODE_SYMLINK=33554432,P9_STAT_MODE_LINK=16777216,P9_STAT_MODE_DEVICE=8388608,P9_STAT_MODE_NAMED_PIPE=2097152,P9_STAT_MODE_SOCKET=1048576,P9_STAT_MODE_SETUID=524288,P9_STAT_MODE_SETGID=262144,P9_STAT_MODE_SETVTX=65536,FID_NONE=-1,FID_INODE=1,FID_XATTR=2;Virtio9p.prototype.get_state=function(){var e=[];return e[0]=this.deviceid,e[1]=this.hostfeature,e[2]=this.configspace,e[3]=this.VERSION,e[4]=this.BLOCKSIZE,e[5]=this.msize,e[6]=this.replybuffer,e[7]=this.replybuffersize,e[8]=this.fids.map(function(e){return[e.inodeid,e.type,e.uid]}),e},Virtio9p.prototype.set_state=function(e){this.deviceid=e[0],this.hostfeature=e[1],this.configspace=e[2],this.VERSION=e[3],this.BLOCKSIZE=e[4],this.msize=e[5],this.replybuffer=e[6],this.replybuffersize=e[7],this.fids=e[8].map(function(e){return{inodeid:e[0],type:e[1],uid:e[2]}})},Virtio9p.prototype.Createfid=function(e,t,s){return{inodeid:e,type:t,uid:s}},Virtio9p.prototype.Reset=function(){this.fids=[]},Virtio9p.prototype.BuildReply=function(e,t,s){marshall.Marshall(["w","b","h"],[s+7,e+1,t],this.replybuffer,0),s+7>=this.replybuffer.length&&message.Debug("Error in 9p: payloadsize exceeds maximum length"),this.replybuffersize=s+7},Virtio9p.prototype.SendError=function(e,t,s){t=marshall.Marshall(["w"],[s],this.replybuffer,7),this.BuildReply(6,e,t)},Virtio9p.prototype.ReceiveRequest=function(e,t){var s=marshall.Unmarshall2(["w","b","h"],t),r=s[0],i=s[1],_=s[2];switch(i){case 8:r=this.fs.GetTotalSize(),t=this.fs.GetSpace();var a=[16914839];a[1]=this.BLOCKSIZE,a[2]=Math.floor(t/a[1]),a[3]=a[2]-Math.floor(r/a[1]),a[4]=a[2]-Math.floor(r/a[1]),a[5]=this.fs.inodes.length,a[6]=1048576,a[7]=0,a[8]=256,r=marshall.Marshall("wwddddddw".split(""),a,this.replybuffer,7),this.BuildReply(i,_,r),this.SendReply(0,e);break;case 112:case 12:a=marshall.Unmarshall2(["w","w"],t);var o=a[0];s=a[1],message.Debug("[open] fid="+o+", mode="+s),t=this.fids[o].inodeid;var n=this.fs.GetInode(t);message.Debug("file open "+n.name),t=this.fs.OpenInode(t,s),this.fs.AddEvent(this.fids[o].inodeid,function(){message.Debug("file opened "+n.name+" tag:"+_),a[0]=n.qid,a[1]=this.msize-24,marshall.Marshall(["Q","w"],a,this.replybuffer,7),this.BuildReply(i,_,17),this.SendReply(0,e)}.bind(this));break;case 70:a=marshall.Unmarshall2(["w","w","s"],t),s=a[0],o=a[1],t=a[2],message.Debug("[link] dfid="+s+", name="+t),n=this.fs.CreateInode(),r=this.fs.GetInode(this.fids[o].inodeid);var d=this.fs.inodedata[this.fids[o].inodeid];n.mode=r.mode,n.size=r.size,n.symlink=r.symlink;var h=this.fs.inodedata[this.fs.inodes.length]=new Uint8Array(n.size);for(r=0;r<n.size;r++)h[r]=d[r];n.name=t,n.parentid=this.fids[s].inodeid,this.fs.PushInode(n),this.BuildReply(i,_,0),this.SendReply(0,e);break;case 16:a=marshall.Unmarshall2(["w","s","s","w"],t),o=a[0],t=a[1],s=a[2],r=a[3],message.Debug("[symlink] fid="+o+", name="+t+", symgt="+s+", gid="+r),t=this.fs.CreateSymlink(t,this.fids[o].inodeid,s),n=this.fs.GetInode(t),n.uid=this.fids[o].uid,n.gid=r,marshall.Marshall(["Q"],[n.qid],this.replybuffer,7),this.BuildReply(i,_,13),this.SendReply(0,e);break;case 18:a=marshall.Unmarshall2("wswwww".split(""),t),o=a[0],t=a[1],s=a[2],d=a[3],h=a[4],r=a[5],message.Debug("[mknod] fid="+o+", name="+t+", major="+d+", minor="+h),t=this.fs.CreateNode(t,this.fids[o].inodeid,d,h),n=this.fs.GetInode(t),n.mode=s,n.uid=this.fids[o].uid,n.gid=r,marshall.Marshall(["Q"],[n.qid],this.replybuffer,7),this.BuildReply(i,_,13),this.SendReply(0,e);break;case 22:a=marshall.Unmarshall2(["w"],t),o=a[0],message.Debug("[readlink] fid="+o),n=this.fs.GetInode(this.fids[o].inodeid),r=marshall.Marshall(["s"],[n.symlink],this.replybuffer,7),this.BuildReply(i,_,r),this.SendReply(0,e);break;case 72:a=marshall.Unmarshall2(["w","s","w","w"],t),o=a[0],t=a[1],s=a[2],r=a[3],message.Debug("[mkdir] fid="+o+", name="+t+", mode="+s+", gid="+r),t=this.fs.CreateDirectory(t,this.fids[o].inodeid),n=this.fs.GetInode(t),n.mode=s|S_IFDIR,n.uid=this.fids[o].uid,n.gid=r,marshall.Marshall(["Q"],[n.qid],this.replybuffer,7),this.BuildReply(i,_,13),this.SendReply(0,e);break;case 14:a=marshall.Unmarshall2(["w","s","w","w","w"],t),o=a[0],t=a[1],d=a[2],s=a[3],r=a[4],message.Debug("[create] fid="+o+", name="+t+", flags="+d+", mode="+s+", gid="+r),t=this.fs.CreateFile(t,this.fids[o].inodeid),this.fids[o].inodeid=t,this.fids[o].type=FID_INODE,n=this.fs.GetInode(t),n.uid=this.fids[o].uid,n.gid=r,n.mode=s,marshall.Marshall(["Q","w"],[n.qid,this.msize-24],this.replybuffer,7),this.BuildReply(i,_,17),this.SendReply(0,e);break;case 52:message.Debug("lock file\n"),marshall.Marshall(["w"],[0],this.replybuffer,7),this.BuildReply(i,_,1),this.SendReply(0,e);break;case 24:if(a=marshall.Unmarshall2(["w","d"],t),o=a[0],n=this.fs.GetInode(this.fids[o].inodeid),message.Debug("[getattr]: fid="+o+" name="+n.name+" request mask="+a[1]),!n||n.status===STATUS_UNLINKED){message.Debug("getattr: unlinked"),this.SendError(_,"No such file or directory",ENOENT),this.SendReply(0,e);break}a[0]|=4096,a[0]=a[1],a[1]=n.qid,a[2]=n.mode,a[3]=n.uid,a[4]=n.gid,a[5]=1,a[6]=n.major<<8|n.minor,a[7]=n.size,a[8]=this.BLOCKSIZE,a[9]=Math.floor(n.size/512+1),a[10]=n.atime,a[11]=0,a[12]=n.mtime,a[13]=0,a[14]=n.ctime,a[15]=0,a[16]=0,a[17]=0,a[18]=0,a[19]=0,marshall.Marshall("dQwwwddddddddddddddd".split(""),a,this.replybuffer,7),this.BuildReply(i,_,153),this.SendReply(0,e);break;case 26:a=marshall.Unmarshall2("wwwwwddddd".split(""),t),o=a[0],n=this.fs.GetInode(this.fids[o].inodeid),message.Debug("[setattr]: fid="+o+" request mask="+a[1]+" name="+n.name),1&a[1]&&(n.mode=a[2]),2&a[1]&&(n.uid=a[3]),4&a[1]&&(n.gid=a[4]),128&a[1]&&(n.atime=a[6]),256&a[1]&&(n.atime=a[8]),16&a[1]&&(n.atime=Math.floor((new Date).getTime()/1e3)),32&a[1]&&(n.mtime=Math.floor((new Date).getTime()/1e3)),64&a[1]&&(n.ctime=Math.floor((new Date).getTime()/1e3)),8&a[1]&&this.fs.ChangeSize(this.fids[o].inodeid,a[5]),this.BuildReply(i,_,0),this.SendReply(0,e);break;case 50:a=marshall.Unmarshall2(["w","d"],t),o=a[0],this.BuildReply(i,_,0),this.SendReply(0,e);break;case 40:case 116:a=marshall.Unmarshall2(["w","d","w"],t),o=a[0];var g=a[1],c=a[2];if(n=this.fs.GetInode(this.fids[o].inodeid),40==i&&message.Debug("[treaddir]: fid="+o+" offset="+g+" count="+c),116==i&&message.Debug("[read]: fid="+o+" ("+n.name+") offset="+g+" count="+c+" fidtype="+this.fids[o].type),!n||n.status===STATUS_UNLINKED){message.Debug("read/treaddir: unlinked"),this.SendError(_,"No such file or directory",ENOENT),this.SendReply(0,e);break}if(this.fids[o].type==FID_XATTR){for(n.caps.length<g+c&&(c=n.caps.length-g),r=0;r<c;r++)this.replybuffer[11+r]=n.caps[g+r];marshall.Marshall(["w"],[c],this.replybuffer,7),this.BuildReply(i,_,4+c),this.SendReply(0,e)}else{var p=this.fs.inodes[this.fids[o].inodeid];this.bus.send("9p-read-start"),this.fs.OpenInode(this.fids[o].inodeid,void 0),this.fs.AddEvent(this.fids[o].inodeid,function(){this.bus.send("9p-read-end",[p.name,c]),n.size<g+c&&(c=n.size-g);var t=this.fs.inodedata[this.fids[o].inodeid];if(t)for(var s=0;s<c;s++)this.replybuffer[11+s]=t[g+s];marshall.Marshall(["w"],[c],this.replybuffer,7),this.BuildReply(i,_,4+c),this.SendReply(0,e)}.bind(this))}break;case 118:a=marshall.Unmarshall2(["w","d","w"],t),o=a[0],g=a[1],c=a[2],message.Debug("[write]: fid="+o+" ("+this.fs.inodes[this.fids[o].inodeid].name+") offset="+g+" count="+c),this.fs.Write(this.fids[o].inodeid,g,c,t),p=this.fs.inodes[this.fids[o].inodeid],this.bus.send("9p-write-end",[p.name,c]),marshall.Marshall(["w"],[c],this.replybuffer,7),this.BuildReply(i,_,4),this.SendReply(0,e);break;case 74:if(a=marshall.Unmarshall2(["w","s","w","s"],t),t=a[0],r=a[1],s=a[2],d=a[3],message.Debug("[renameat]: oldname="+r+" newname="+d),0==(t=this.fs.Rename(this.fids[t].inodeid,r,this.fids[s].inodeid,d))){this.SendError(_,"No such file or directory",ENOENT),this.SendReply(0,e);break}this.BuildReply(i,_,0),this.SendReply(0,e);break;case 76:if(a=marshall.Unmarshall2(["w","s","w"],t),r=a[0],t=a[1],d=a[2],message.Debug("[unlink]: dirfd="+r+" name="+t+" flags="+d),-1==(o=this.fs.Search(this.fids[r].inodeid,t))){this.SendError(_,"No such file or directory",ENOENT),this.SendReply(0,e);break}if(!(t=this.fs.Unlink(o))){this.SendError(_,"Directory not empty",39),this.SendReply(0,e);break}this.BuildReply(i,_,0),this.SendReply(0,e);break;case 100:t=marshall.Unmarshall2(["w","s"],t),message.Debug("[version]: msize="+t[0]+" version="+t[1]),this.msize=t[0],r=marshall.Marshall(["w","s"],[this.msize,this.VERSION],this.replybuffer,7),this.BuildReply(i,_,r),this.SendReply(0,e);break;case 104:a=marshall.Unmarshall2(["w","w","s","s","w"],t),o=a[0],t=a[4],message.Debug("[attach]: fid="+o+" afid="+hex8(a[1])+" uname="+a[2]+" aname="+a[3]),this.fids[o]=this.Createfid(0,FID_INODE,t),n=this.fs.GetInode(this.fids[o].inodeid),marshall.Marshall(["Q"],[n.qid],this.replybuffer,7),this.BuildReply(i,_,13),this.SendReply(0,e);break;case 108:a=marshall.Unmarshall2(["h"],t),message.Debug("[flush] "+_),this.BuildReply(i,_,0),this.SendReply(0,e);break;case 110:if(a=marshall.Unmarshall2(["w","w","h"],t),o=a[0],s=a[1],d=a[2],message.Debug("[walk]: fid="+a[0]+" nwfid="+a[1]+" nwname="+d),0==d){this.fids[s]=this.Createfid(this.fids[o].inodeid,FID_INODE,this.fids[o].uid),marshall.Marshall(["h"],[0],this.replybuffer,7),this.BuildReply(i,_,2),this.SendReply(0,e);break}for(h=[],r=0;r<d;r++)h.push("s");h=marshall.Unmarshall2(h,t),t=this.fids[o].inodeid,g=9;var u=0;for(message.Debug("walk in dir "+this.fs.inodes[t].name+" to: "+h.toString()),r=0;r<d;r++){if(-1==(t=this.fs.Search(t,h[r]))){message.Debug("Could not find: "+h[r]);break}g+=marshall.Marshall(["Q"],[this.fs.inodes[t].qid],this.replybuffer,g),u++,this.fids[s]=this.Createfid(t,FID_INODE,this.fids[o].uid)}marshall.Marshall(["h"],[u],this.replybuffer,7),this.BuildReply(i,_,g-7),this.SendReply(0,e);break;case 120:a=marshall.Unmarshall2(["w"],t),message.Debug("[clunk]: fid="+a[0]),this.fids[a[0]]&&0<=this.fids[a[0]].inodeid&&(this.fs.CloseInode(this.fids[a[0]].inodeid),this.fids[a[0]].inodeid=-1,this.fids[a[0]].type=FID_NONE),this.BuildReply(i,_,0),this.SendReply(0,e);break;case 32:a=marshall.Unmarshall2(["w","s","d","w"],t),o=a[0],t=a[1],r=a[2],d=a[3],message.Debug("[txattrcreate]: fid="+o+" name="+t+" attr_size="+r+" flags="+d),this.BuildReply(i,_,0),this.SendReply(0,e);break;case 30:a=marshall.Unmarshall2(["w","w","s"],t),o=a[0],r=a[1],t=a[2],message.Debug("[xattrwalk]: fid="+a[0]+" newfid="+a[1]+" name="+a[2]),this.fids[r]=this.Createfid(this.fids[o].inodeid,FID_NONE,this.fids[o].uid),s=0,"security.capability"==t&&(s=this.fs.PrepareCAPs(this.fids[o].inodeid),this.fids[r].type=FID_XATTR),marshall.Marshall(["d"],[s],this.replybuffer,7),this.BuildReply(i,_,8),this.SendReply(0,e);break;default:message.Debug("Error in Virtio9p: Unknown id "+i+" received"),message.Abort()}};var DEBUG=!1,LOG_TO_FILE=!1,LOG_ALL_IO=!1,LOG_PAGE_FAULTS=!1,LOG_LEVEL=LOG_ALL&~LOG_PS2&~LOG_PIT&~LOG_VIRTIO&~LOG_9P&~LOG_PIC&~LOG_DMA&~LOG_SERIAL&~LOG_NET&~LOG_FLOPPY&~LOG_DISK,ENABLE_HPET=DEBUG&&!1,ENABLE_ACPI=!1,LOOP_COUNTER=11001,TIME_PER_FRAME=1,TSC_RATE=8192,APIC_TIMER_FREQ=TSC_RATE,VMWARE_HYPERVISOR_PORT=!0;IO.prototype.create_empty_entry=function(){return{read8:this.empty_port_read8,read16:this.empty_port_read16,read32:this.empty_port_read32,write8:this.empty_port_write,write16:this.empty_port_write,write32:this.empty_port_write,device:void 0}},IO.prototype.empty_port_read8=function(){return 255},IO.prototype.empty_port_read16=function(){return 65535},IO.prototype.empty_port_read32=function(){return-1},IO.prototype.empty_port_write=function(e){},IO.prototype.register_read=function(e,t,s,r,i){if(dbg_assert("number"==typeof e),dbg_assert("object"==typeof t),dbg_assert(!s||"function"==typeof s),dbg_assert(!r||"function"==typeof r),dbg_assert(!i||"function"==typeof i),dbg_assert(s||r||i),DEBUG){var _=function(s){return dbg_assert(!1,"Overlapped read"+s+" "+h(e,4)+" ("+t.name+")"),-1>>>32-s|0};s||(s=_.bind(this,8)),r||(r=_.bind(this,16)),i||(i=_.bind(this,32))}s&&(this.ports[e].read8=s),r&&(this.ports[e].read16=r),i&&(this.ports[e].read32=i),this.ports[e].device=t},IO.prototype.register_write=function(e,t,s,r,i){if(dbg_assert("number"==typeof e),dbg_assert("object"==typeof t),dbg_assert(!s||"function"==typeof s),dbg_assert(!r||"function"==typeof r),dbg_assert(!i||"function"==typeof i),dbg_assert(s||r||i),DEBUG){var _=function(s){dbg_assert(!1,"Overlapped write"+s+" "+h(e)+" ("+t.name+")")};s||(s=_.bind(this,8)),r||(r=_.bind(this,16)),i||(i=_.bind(this,32))}s&&(this.ports[e].write8=s),r&&(this.ports[e].write16=r),i&&(this.ports[e].write32=i),this.ports[e].device=t},IO.prototype.register_read_consecutive=function(e,t,s,r,i,_){function a(){return s.call(this)|r.call(this)<<8}function o(){return i.call(this)|_.call(this)<<8}function n(){return s.call(this)|r.call(this)<<8|i.call(this)<<16|_.call(this)<<24}dbg_assert(4===arguments.length||6===arguments.length),i&&_?(this.register_read(e,t,s,a,n),this.register_read(e+1,t,r),this.register_read(e+2,t,i,o),this.register_read(e+3,t,_)):(this.register_read(e,t,s,a),this.register_read(e+1,t,r))},IO.prototype.register_write_consecutive=function(e,t,s,r,i,_){function a(e){s.call(this,255&e),r.call(this,e>>8&255)}function o(e){i.call(this,255&e),_.call(this,e>>8&255)}function n(e){s.call(this,255&e),r.call(this,e>>8&255),i.call(this,e>>16&255),_.call(this,e>>>24)}dbg_assert(4===arguments.length||6===arguments.length),i&&_?(this.register_write(e,t,s,a,n),this.register_write(e+1,t,r),this.register_write(e+2,t,i,o),this.register_write(e+3,t,_)):(this.register_write(e,t,s,a),this.register_write(e+1,t,r))},IO.prototype.in_mmap_range=function(e,t){if(e>>>=0,(t=e+(t>>>0))>=this.cpu.memory_size)return!0;for(e&=~(MMAP_BLOCK_SIZE-1);e<t;){if(this.cpu.in_mapped_range(e))return!0;e+=MMAP_BLOCK_SIZE}return!1},IO.prototype.mmap_read32_shim=function(e){var t=this.cpu.memory_map_read8[e>>>MMAP_BLOCK_BITS];return t(e)|t(e+1)<<8|t(e+2)<<16|t(e+3)<<24},IO.prototype.mmap_write32_shim=function(e,t){var s=this.cpu.memory_map_write8[e>>>MMAP_BLOCK_BITS];s(e,255&t),s(e+1,t>>8&255),s(e+2,t>>16&255),s(e+3,t>>>24)},IO.prototype.mmap_register=function(e,t,s,r,i,_){for(dbg_log("mmap_register addr="+h(e>>>0,8)+" size="+h(t,8),LOG_IO),dbg_assert(0==(e&MMAP_BLOCK_SIZE-1)),dbg_assert(t&&0==(t&MMAP_BLOCK_SIZE-1)),i||(i=this.mmap_read32_shim.bind(this)),_||(_=this.mmap_write32_shim.bind(this)),
e>>>=MMAP_BLOCK_BITS;0<t;e++)this.cpu.memory_map_read8[e]=s,this.cpu.memory_map_write8[e]=r,this.cpu.memory_map_read32[e]=i,this.cpu.memory_map_write32[e]=_,t-=MMAP_BLOCK_SIZE},IO.prototype.port_write8=function(e,t){var s=this.ports[e];return(s.write8===this.empty_port_write||LOG_ALL_IO)&&dbg_log("write8 port #"+h(e,4)+" <- "+h(t,2)+this.get_port_description(e),LOG_IO),s.write8.call(s.device,t)},IO.prototype.port_write16=function(e,t){var s=this.ports[e];return(s.write16===this.empty_port_write||LOG_ALL_IO)&&dbg_log("write16 port #"+h(e,4)+" <- "+h(t,4)+this.get_port_description(e),LOG_IO),s.write16.call(s.device,t)},IO.prototype.port_write32=function(e,t){var s=this.ports[e];return(s.write32===this.empty_port_write||LOG_ALL_IO)&&dbg_log("write32 port #"+h(e,4)+" <- "+h(t>>>0,8)+this.get_port_description(e),LOG_IO),s.write32.call(s.device,t)},IO.prototype.port_read8=function(e){var t=this.ports[e];return(t.read8===this.empty_port_read8||LOG_ALL_IO)&&dbg_log("read8 port #"+h(e,4)+this.get_port_description(e),LOG_IO),t=t.read8.call(t.device),dbg_assert(256>t,"8 bit port returned large value: "+h(e)),t},IO.prototype.port_read16=function(e){var t=this.ports[e];return(t.read16===this.empty_port_read16||LOG_ALL_IO)&&dbg_log("read16 port #"+h(e,4)+this.get_port_description(e),LOG_IO),t=t.read16.call(t.device),dbg_assert(65536>t&&0<=t,"16 bit port returned large value: "+h(e)),t},IO.prototype.port_read32=function(e){var t=this.ports[e];return(t.read32===this.empty_port_read32||LOG_ALL_IO)&&dbg_log("read32 port #"+h(e,4)+this.get_port_description(e),LOG_IO),e=t.read32.call(t.device),dbg_assert((0|e)===e),e};var debug_port_list={4:"PORT_DMA_ADDR_2",5:"PORT_DMA_CNT_2",10:"PORT_DMA1_MASK_REG",11:"PORT_DMA1_MODE_REG",12:"PORT_DMA1_CLEAR_FF_REG",13:"PORT_DMA1_MASTER_CLEAR",32:"PORT_PIC1_CMD",33:"PORT_PIC1_DATA",64:"PORT_PIT_COUNTER0",65:"PORT_PIT_COUNTER1",66:"PORT_PIT_COUNTER2",67:"PORT_PIT_MODE",96:"PORT_PS2_DATA",97:"PORT_PS2_CTRLB",100:"PORT_PS2_STATUS",112:"PORT_CMOS_INDEX",113:"PORT_CMOS_DATA",128:"PORT_DIAG",129:"PORT_DMA_PAGE_2",146:"PORT_A20",160:"PORT_PIC2_CMD",161:"PORT_PIC2_DATA",178:"PORT_SMI_CMD",179:"PORT_SMI_STATUS",212:"PORT_DMA2_MASK_REG",214:"PORT_DMA2_MODE_REG",218:"PORT_DMA2_MASTER_CLEAR",240:"PORT_MATH_CLEAR",368:"PORT_ATA2_CMD_BASE",496:"PORT_ATA1_CMD_BASE",632:"PORT_LPT2",744:"PORT_SERIAL4",760:"PORT_SERIAL2",884:"PORT_ATA2_CTRL_BASE",888:"PORT_LPT1",1e3:"PORT_SERIAL3",1008:"PORT_FD_BASE",1010:"PORT_FD_DOR",1012:"PORT_FD_STATUS",1013:"PORT_FD_DATA",1014:"PORT_HD_DATA",1015:"PORT_FD_DIR",1016:"PORT_SERIAL1",3320:"PORT_PCI_CMD",3321:"PORT_PCI_REBOOT",3324:"PORT_PCI_DATA",1026:"PORT_BIOS_DEBUG",1296:"PORT_QEMU_CFG_CTL",1297:"PORT_QEMU_CFG_DATA",45056:"PORT_ACPI_PM_BASE",45312:"PORT_SMB_BASE",35072:"PORT_BIOS_APM"};if(IO.prototype.get_port_description=function(e){return debug_port_list[e]?" ("+debug_port_list[e]+")":""},v86.prototype.run=function(){this.running||(this.bus.send("emulator-started"),this.fast_next_tick())},v86.prototype.do_tick=function(){if(this.stopped)this.stopped=this.running=!1,this.bus.send("emulator-stopped");else{this.running=!0;var e=this.cpu.main_run();0>=e?this.fast_next_tick():this.next_tick(e)}},v86.prototype.stop=function(){this.running&&(this.stopped=!0)},v86.prototype.restart=function(){this.cpu.reset(),this.cpu.load_bios()},v86.prototype.init=function(e){this.cpu.init(e,this.bus),this.bus.send("emulator-ready")},"undefined"!=typeof setImmediate)var fast_next_tick=function(){var e=this;setImmediate(function(){e.do_tick()})},register_tick=function(){};else if("undefined"!=typeof window&&"undefined"!=typeof postMessage){var MAGIC_POST_MESSAGE=43605;fast_next_tick=function(){window.postMessage(MAGIC_POST_MESSAGE,"*")},register_tick=function(){var e=this;window.addEventListener("message",function(t){t.source===window&&t.data===MAGIC_POST_MESSAGE&&e.do_tick()},!1)}}else fast_next_tick=function(){var e=this;setTimeout(function(){e.do_tick()},0)},register_tick=function(){};v86.prototype.fast_next_tick=fast_next_tick,v86.prototype.register_tick=register_tick;var next_tick="undefined"!=typeof document&&"boolean"==typeof document.hidden?function(e){var t=this;4>e||document.hidden?this.fast_next_tick():setTimeout(function(){t.do_tick()},e)}:function(e){var t=this;setTimeout(function(){t.do_tick()},e)};v86.prototype.next_tick=next_tick,v86.prototype.save_state=function(){return this.cpu.save_state()},v86.prototype.restore_state=function(e){return this.cpu.restore_state(e)},v86.microtick="object"==typeof performance&&performance.now?function(){return performance.now()}:Date.now;var v86util=v86util||{};if(v86util.pads=function(e,t){for(e=e?e+"":"";e.length<t;)e+=" ";return e},v86util.pad0=function(e,t){for(e=e?e+"":"";e.length<t;)e="0"+e;return e},"undefined"!=typeof window&&window.crypto&&window.crypto.getRandomValues){var rand_data=new Int32Array(1);v86util.has_rand_int=function(){return!0},v86util.get_rand_int=function(){return window.crypto.getRandomValues(rand_data),rand_data[0]}}else v86util.has_rand_int=function(){return!1},v86util.get_rand_int=function(){console.assert(!1)};SyncBuffer.prototype.load=function(){this.onload&&this.onload({buffer:this.buffer})},SyncBuffer.prototype.get=function(e,t,s){dbg_assert(e+t<=this.byteLength),s(new Uint8Array(this.buffer,e,t))},SyncBuffer.prototype.set=function(e,t,s){dbg_assert(e+t.byteLength<=this.byteLength),new Uint8Array(this.buffer,e,t.byteLength).set(t),s()},SyncBuffer.prototype.get_buffer=function(e){e(this.buffer)},function(){for(var e=new Int8Array(256),t=0,s=-2;256>t;t++)t&t-1||s++,e[t]=s;v86util.int_log2_byte=function(t){return dbg_assert(0<t),dbg_assert(256>t),e[t]},v86util.int_log2=function(t){dbg_assert(0<t);var s=t>>>16;if(s){var r=s>>>8;return r?24+e[r]:16+e[s]}return(r=t>>>8)?8+e[r]:e[t]}}(),FloatQueue.prototype.push=function(e){this.length===this.size?this.start=this.start+1&this.size-1:this.length++,this.data[this.end]=e,this.end=this.end+1&this.size-1},FloatQueue.prototype.shift=function(){if(this.length){var e=this.data[this.start];return this.start=this.start+1&this.size-1,this.length--,e}},FloatQueue.prototype.shift_block=function(e){var t=new Float32Array(e);e>this.length&&(e=this.length);var s=this.start+e,r=this.data.subarray(this.start,s);return t.set(r),s>=this.size&&(s-=this.size,t.set(this.data.subarray(0,s),r.length)),this.start=s,this.length-=e,t},FloatQueue.prototype.peek=function(){if(this.length)return this.data[this.start]},FloatQueue.prototype.clear=function(){this.length=this.end=this.start=0},CircularQueue.prototype.add=function(e){this.data[this.index]=e,this.index=(this.index+1)%this.size},CircularQueue.prototype.toArray=function(){return[].slice.call(this.data,this.index).concat([].slice.call(this.data,0,this.index))},CircularQueue.prototype.clear=function(){this.data=[],this.index=0},CircularQueue.prototype.set=function(e){this.data=e,this.index=0};var FPU_C0=256,FPU_C1=512,FPU_C2=1024,FPU_C3=16384,FPU_RESULT_FLAGS=FPU_C0|FPU_C1|FPU_C2|FPU_C3,FPU_STACK_TOP=14336,FPU_PC=768,FPU_RC=3072,FPU_IF=4096,FPU_EX_P=32,FPU_EX_U=16,FPU_EX_O=8,FPU_EX_Z=4,FPU_EX_D=2,FPU_EX_I=1,TWO_POW_63=0x8000000000000000;FPU.prototype.get_state=function(){var e=[];return e[0]=this.st,e[1]=this.stack_empty,e[2]=this.stack_ptr,e[3]=this.control_word,e[4]=this.fpu_dp_selector,e[5]=this.fpu_ip,e[6]=this.fpu_ip_selector,e[7]=this.fpu_dp,e[8]=this.fpu_dp_selector,e[9]=this.fpu_opcode,e},FPU.prototype.set_state=function(e){this.st.set(e[0]),this.stack_empty=e[1],this.stack_ptr=e[2],this.control_word=e[3],this.fpu_ip=e[5],this.fpu_ip_selector=e[6],this.fpu_dp=e[7],this.fpu_dp_selector=e[8],this.fpu_opcode=e[9]},FPU.prototype.fpu_unimpl=function(){if(dbg_trace(),DEBUG)throw"fpu: unimplemented";this.cpu.trigger_ud()},FPU.prototype.stack_fault=function(){this.status_word=64|this.status_word|FPU_EX_I},FPU.prototype.invalid_arithmatic=function(){this.status_word|=FPU_EX_I},FPU.prototype.fcom=function(e){var t=this.get_st0();this.status_word&=~FPU_RESULT_FLAGS,t>e||(this.status_word=e>t?this.status_word|FPU_C0:t===e?this.status_word|FPU_C3:this.status_word|FPU_C0|FPU_C2|FPU_C3)},FPU.prototype.fucom=function(e){this.fcom(e)},FPU.prototype.fcomi=function(e){var t=this.st[this.stack_ptr];this.cpu.flags_changed&=~(1|flag_parity|flag_zero),this.cpu.flags&=~(1|flag_parity|flag_zero),t>e||(this.cpu.flags=e>t?1|this.cpu.flags:t===e?this.cpu.flags|flag_zero:1|this.cpu.flags|flag_parity|flag_zero)},FPU.prototype.fucomi=function(e){this.fcomi(e)},FPU.prototype.ftst=function(e){this.status_word&=~FPU_RESULT_FLAGS,isNaN(e)?this.status_word=this.status_word|FPU_C3|FPU_C2|FPU_C0:0===e?this.status_word|=FPU_C3:0>e&&(this.status_word|=FPU_C0)},FPU.prototype.fxam=function(e){this.status_word&=~FPU_RESULT_FLAGS,this.status_word|=this.sign(0)<<9,this.stack_empty>>this.stack_ptr&1?this.status_word=this.status_word|FPU_C3|FPU_C0:isNaN(e)?this.status_word|=FPU_C0:this.status_word=0===e?this.status_word|FPU_C3:1/0===e||-1/0===e?this.status_word|FPU_C2|FPU_C0:this.status_word|FPU_C2},FPU.prototype.finit=function(){this.control_word=895,this.fpu_opcode=this.fpu_dp=this.fpu_ip=this.status_word=0,this.stack_empty=255,this.stack_ptr=0},FPU.prototype.load_status_word=function(){return-14337&this.status_word|this.stack_ptr<<11},FPU.prototype.set_status_word=function(e){this.status_word=-14337&e,this.stack_ptr=e>>11&7},FPU.prototype.load_tag_word=function(){for(var e=0,t,s=0;8>s;s++)t=this.st[s],this.stack_empty>>s&1?e|=3<<(s<<1):0===t?e|=1<<(s<<1):isFinite(t)||(e|=2<<(s<<1));return e},FPU.prototype.set_tag_word=function(e){for(var t=this.stack_empty=0;8>t;t++)this.stack_empty|=e>>t&e>>t+1&1<<t},FPU.prototype.fstenv=function(e){this.cpu.is_osize_32()?(this.cpu.writable_or_pagefault(e,26),this.cpu.safe_write16(e,this.control_word),this.cpu.safe_write16(e+4,this.load_status_word()),this.cpu.safe_write16(e+8,this.load_tag_word()),this.cpu.safe_write32(e+12,this.fpu_ip),this.cpu.safe_write16(e+16,this.fpu_ip_selector),this.cpu.safe_write16(e+18,this.fpu_opcode),this.cpu.safe_write32(e+20,this.fpu_dp),this.cpu.safe_write16(e+24,this.fpu_dp_selector)):this.fpu_unimpl()},FPU.prototype.fldenv=function(e){this.cpu.is_osize_32()?(this.control_word=this.cpu.safe_read16(e),this.set_status_word(this.cpu.safe_read16(e+4)),this.set_tag_word(this.cpu.safe_read16(e+8)),this.fpu_ip=this.cpu.safe_read32s(e+12),this.fpu_ip_selector=this.cpu.safe_read16(e+16),this.fpu_opcode=this.cpu.safe_read16(e+18),this.fpu_dp=this.cpu.safe_read32s(e+20),this.fpu_dp_selector=this.cpu.safe_read16(e+24)):this.fpu_unimpl()},FPU.prototype.fsave=function(e){this.cpu.writable_or_pagefault(e,108),this.fstenv(e),e+=28;for(var t=0;8>t;t++)this.store_m80(e,this.st[this.stack_ptr+t&7]),e+=10;this.finit()},FPU.prototype.frstor=function(e){this.fldenv(e),e+=28;for(var t=0;8>t;t++)this.st[t+this.stack_ptr&7]=this.load_m80(e),e+=10},FPU.prototype.fxtract=function(){this.float64[0]=this.get_st0();var e=((127&this.float64_byte[7])<<4|this.float64_byte[6]>>4)-1023;this.float64_byte[7]=63|128&this.float64_byte[7],this.float64_byte[6]|=240,this.st[this.stack_ptr]=e,this.push(this.float64[0])},FPU.prototype.integer_round=function(e){var t=this.control_word>>10&3;return 0===t?(t=Math.round(e),.5==t-e&&t%2&&t--,t):1===t||3===t&&0<e?Math.floor(e):Math.ceil(e)},FPU.prototype.truncate=function(e){return 0<e?Math.floor(e):Math.ceil(e)},FPU.prototype.push=function(e){this.stack_ptr=this.stack_ptr-1&7,this.stack_empty>>this.stack_ptr&1?(this.status_word&=~FPU_C1,this.stack_empty&=~(1<<this.stack_ptr),this.st[this.stack_ptr]=e):(this.status_word|=FPU_C1,this.stack_fault(),this.st[this.stack_ptr]=this.indefinite_nan)},FPU.prototype.pop=function(){this.stack_empty|=1<<this.stack_ptr,this.stack_ptr=this.stack_ptr+1&7},FPU.prototype.get_sti=function(e){return dbg_assert("number"==typeof e&&0<=e&&8>e),e=e+this.stack_ptr&7,this.stack_empty>>e&1?(this.status_word&=~FPU_C1,this.stack_fault(),this.indefinite_nan):this.st[e]},FPU.prototype.get_st0=function(){return this.stack_empty>>this.stack_ptr&1?(this.status_word&=~FPU_C1,this.stack_fault(),this.indefinite_nan):this.st[this.stack_ptr]},FPU.prototype.load_m80=function(e){var t=this.cpu.safe_read16(e+8),s=this.cpu.safe_read32s(e)>>>0,r=this.cpu.safe_read32s(e+4)>>>0;return e=t>>15,0==(t&=-32769)?0:32767>t?(s+=4294967296*r,e&&(s=-s),s*Math.pow(2,t-16383-63)):(this.float64_byte[7]=127|e<<7,this.float64_byte[6]=240|r>>30<<3&8,this.float64_byte[5]=0,this.float64_byte[4]=0,this.float64_int[0]=0,this.float64[0])},FPU.prototype.store_m80=function(e,t){this.float64[0]=t,t=128&this.float64_byte[7];var s=(127&this.float64_byte[7])<<4|this.float64_byte[6]>>4;if(2047===s){s=32767;var r=0,i=2147483648|(524288&this.float64_int[1])<<11}else 0===s?i=r=0:(s+=15360,r=this.float64_int[0]<<11,i=2147483648|(1048575&this.float64_int[1])<<11|this.float64_int[0]>>>21);dbg_assert(0<=s&&32768>s),this.cpu.safe_write32(e,r),this.cpu.safe_write32(e+4,i),this.cpu.safe_write16(e+8,t<<8|s)},FPU.prototype.load_m64=function(e){var t=this.cpu.safe_read32s(e);return e=this.cpu.safe_read32s(e+4),this.float64_int[0]=t,this.float64_int[1]=e,this.float64[0]},FPU.prototype.store_m64=function(e,t){this.cpu.writable_or_pagefault(e,8),this.float64[0]=this.get_sti(t),this.cpu.safe_write32(e,this.float64_int[0]),this.cpu.safe_write32(e+4,this.float64_int[1])},FPU.prototype.load_m32=function(e){return this.float32_int[0]=this.cpu.safe_read32s(e),this.float32[0]},FPU.prototype.store_m32=function(e,t){this.float32[0]=t,this.cpu.safe_write32(e,this.float32_int[0])},FPU.prototype.sign=function(e){return this.st8[(this.stack_ptr+e&7)<<3|7]>>7},FPU.prototype.dbg_log_fpu_op=function(e,t){},FPU.prototype.fwait=function(){},FPU.prototype.op_D8_reg=function(e){this.dbg_log_fpu_op(216,e);var t=e>>3&7;e=this.get_sti(7&e);var s=this.get_st0();switch(t){case 0:this.st[this.stack_ptr]=s+e;break;case 1:this.st[this.stack_ptr]=s*e;break;case 2:this.fcom(e);break;case 3:this.fcom(e),this.pop();break;case 4:this.st[this.stack_ptr]=s-e;break;case 5:this.st[this.stack_ptr]=e-s;break;case 6:this.st[this.stack_ptr]=s/e;break;case 7:this.st[this.stack_ptr]=e/s;break;default:dbg_assert(!1)}},FPU.prototype.op_D8_mem=function(e,t){this.dbg_log_fpu_op(216,e),e=e>>3&7,t=this.load_m32(t);var s=this.get_st0();switch(e){case 0:this.st[this.stack_ptr]=s+t;break;case 1:this.st[this.stack_ptr]=s*t;break;case 2:this.fcom(t);break;case 3:this.fcom(t),this.pop();break;case 4:this.st[this.stack_ptr]=s-t;break;case 5:this.st[this.stack_ptr]=t-s;break;case 6:this.st[this.stack_ptr]=s/t;break;case 7:this.st[this.stack_ptr]=t/s;break;default:dbg_assert(!1)}},FPU.prototype.op_D9_reg=function(e){this.dbg_log_fpu_op(217,e);var t=7&e;switch(e>>3&7){case 0:e=this.get_sti(t),this.push(e);break;case 1:e=this.get_sti(t),this.st[this.stack_ptr+t&7]=this.get_st0(),this.st[this.stack_ptr]=e;break;case 2:switch(t){case 0:break;default:dbg_log(t),this.fpu_unimpl()}break;case 3:this.fpu_unimpl();break;case 4:switch(e=this.get_st0(),t){case 0:this.st[this.stack_ptr]=-e;break;case 1:this.st[this.stack_ptr]=Math.abs(e);break;case 4:this.ftst(e);break;case 5:this.fxam(e);break;default:dbg_log(t),this.fpu_unimpl()}break;case 5:this.push(this.constants[t]);break;case 6:switch(e=this.get_st0(),t){case 0:this.st[this.stack_ptr]=Math.pow(2,e)-1;break;case 1:this.st[this.stack_ptr+1&7]=this.get_sti(1)*Math.log(e)/Math.LN2,this.pop();break;case 2:this.st[this.stack_ptr]=Math.tan(e),this.push(1);break;case 3:this.st[this.stack_ptr+1&7]=Math.atan2(this.get_sti(1),e),this.pop();break;case 4:this.fxtract();break;case 5:this.st[this.stack_ptr]=e%this.get_sti(1);break;case 6:this.stack_ptr=this.stack_ptr-1&7,this.status_word&=~FPU_C1;break;case 7:this.stack_ptr=this.stack_ptr+1&7,this.status_word&=~FPU_C1;break;default:dbg_assert(!1)}break;case 7:switch(e=this.get_st0(),t){case 0:t=this.get_sti(1);var s=Math.trunc(e/t);this.st[this.stack_ptr]=e%t,this.status_word&=~(FPU_C0|FPU_C1|FPU_C3),1&s&&(this.status_word|=FPU_C1),2&s&&(this.status_word|=FPU_C3),4&s&&(this.status_word|=FPU_C0),this.status_word&=~FPU_C2;break;case 1:this.st[this.stack_ptr+1&7]=this.get_sti(1)*Math.log(e+1)/Math.LN2,this.pop();break;case 2:this.st[this.stack_ptr]=Math.sqrt(e);break;case 3:this.st[this.stack_ptr]=Math.sin(e),this.push(Math.cos(e));break;case 4:this.st[this.stack_ptr]=this.integer_round(e);break;case 5:this.st[this.stack_ptr]=e*Math.pow(2,this.truncate(this.get_sti(1)));break;case 6:this.st[this.stack_ptr]=Math.sin(e);break;case 7:this.st[this.stack_ptr]=Math.cos(e);break;default:dbg_assert(!1)}break;default:dbg_assert(!1)}},FPU.prototype.op_D9_mem=function(e,t){switch(this.dbg_log_fpu_op(217,e),e>>3&7){case 0:e=this.load_m32(t),this.push(e);break;case 1:this.fpu_unimpl();break;case 2:this.store_m32(t,this.get_st0());break;case 3:this.store_m32(t,this.get_st0()),this.pop();break;case 4:this.fldenv(t);break;case 5:this.control_word=this.cpu.safe_read16(t);break;case 6:this.fstenv(t);break;case 7:this.cpu.safe_write16(t,this.control_word);break;default:dbg_assert(!1)}},FPU.prototype.op_DA_reg=function(e){this.dbg_log_fpu_op(218,e);var t=e>>3&7;switch(e&=7,t){case 0:this.cpu.test_b()&&(this.st[this.stack_ptr]=this.get_sti(e),this.stack_empty&=~(1<<this.stack_ptr));break;case 1:this.cpu.test_z()&&(this.st[this.stack_ptr]=this.get_sti(e),this.stack_empty&=~(1<<this.stack_ptr));break;case 2:this.cpu.test_be()&&(this.st[this.stack_ptr]=this.get_sti(e),this.stack_empty&=~(1<<this.stack_ptr));break;case 3:this.cpu.test_p()&&(this.st[this.stack_ptr]=this.get_sti(e),this.stack_empty&=~(1<<this.stack_ptr));break;case 5:1===e?(this.fucom(this.get_sti(1)),this.pop(),this.pop()):(dbg_log(t),this.fpu_unimpl());break;default:dbg_log(t),this.fpu_unimpl()}},FPU.prototype.op_DA_mem=function(e,t){this.dbg_log_fpu_op(218,e),e=e>>3&7,t=this.cpu.safe_read32s(t);var s=this.get_st0();switch(e){case 0:this.st[this.stack_ptr]=s+t;break;case 1:this.st[this.stack_ptr]=s*t;break;case 2:this.fcom(t);break;case 3:this.fcom(t),this.pop();break;case 4:this.st[this.stack_ptr]=s-t;break;case 5:this.st[this.stack_ptr]=t-s;break;case 6:this.st[this.stack_ptr]=s/t;break;case 7:this.st[this.stack_ptr]=t/s;break;default:dbg_assert(!1)}},FPU.prototype.op_DB_reg=function(e){this.dbg_log_fpu_op(219,e);var t=e>>3&7,s=7&e;switch(t){case 0:this.cpu.test_b()||(this.st[this.stack_ptr]=this.get_sti(s),this.stack_empty&=~(1<<this.stack_ptr));break;case 1:this.cpu.test_z()||(this.st[this.stack_ptr]=this.get_sti(s),this.stack_empty&=~(1<<this.stack_ptr));break;case 2:this.cpu.test_be()||(this.st[this.stack_ptr]=this.get_sti(s),this.stack_empty&=~(1<<this.stack_ptr));break;case 3:this.cpu.test_p()||(this.st[this.stack_ptr]=this.get_sti(s),this.stack_empty&=~(1<<this.stack_ptr));break;case 4:227===e?this.finit():228!==e&&225!==e&&(226===e?this.status_word=0:(dbg_log(h(e)),this.fpu_unimpl()));break;case 5:this.fucomi(this.get_sti(s));break;case 6:this.fcomi(this.get_sti(s));break;default:dbg_log(t),this.fpu_unimpl()}},FPU.prototype.op_DB_mem=function(e,t){switch(this.dbg_log_fpu_op(219,e),e=e>>3&7){case 0:t=this.cpu.safe_read32s(t),this.push(t);break;case 2:e=this.integer_round(this.get_st0()),2147483647>=e&&-2147483648<=e?this.cpu.safe_write32(t,e):(this.invalid_arithmatic(),this.cpu.safe_write32(t,-2147483648));break;case 3:e=this.integer_round(this.get_st0()),2147483647>=e&&-2147483648<=e?this.cpu.safe_write32(t,e):(this.invalid_arithmatic(),this.cpu.safe_write32(t,-2147483648)),this.pop();break;case 5:this.push(this.load_m80(t));break;case 7:this.cpu.writable_or_pagefault(t,10),this.store_m80(t,this.get_st0()),this.pop();break;default:dbg_log(e),this.fpu_unimpl()}},FPU.prototype.op_DC_reg=function(e){this.dbg_log_fpu_op(220,e);var t=e>>3&7,s=7&e;e=this.stack_ptr+s&7,s=this.get_sti(s);var r=this.get_st0();switch(t){case 0:this.st[e]=s+r;break;case 1:this.st[e]=s*r;break;case 2:this.fcom(s);break;case 3:this.fcom(s),this.pop();break;case 4:this.st[e]=r-s;break;case 5:this.st[e]=s-r;break;case 6:this.st[e]=r/s;break;case 7:this.st[e]=s/r;break;default:dbg_assert(!1)}},FPU.prototype.op_DC_mem=function(e,t){this.dbg_log_fpu_op(220,e),e=e>>3&7,t=this.load_m64(t);var s=this.get_st0();switch(e){case 0:this.st[this.stack_ptr]=s+t;break;case 1:this.st[this.stack_ptr]=s*t;break;case 2:this.fcom(t);break;case 3:this.fcom(t),this.pop();break;case 4:this.st[this.stack_ptr]=s-t;break;case 5:this.st[this.stack_ptr]=t-s;break;case 6:this.st[this.stack_ptr]=s/t;break;case 7:this.st[this.stack_ptr]=t/s;break;default:dbg_assert(!1)}},FPU.prototype.op_DD_reg=function(e){this.dbg_log_fpu_op(221,e);var t=e>>3&7;switch(e&=7,t){case 0:this.stack_empty|=1<<(this.stack_ptr+e&7);break;case 2:this.st[this.stack_ptr+e&7]=this.get_st0();break;case 3:0!==e&&(this.st[this.stack_ptr+e&7]=this.get_st0()),this.pop();break;case 4:this.fucom(this.get_sti(e));break;case 5:this.fucom(this.get_sti(e)),this.pop();break;default:dbg_log(t),this.fpu_unimpl()}},FPU.prototype.op_DD_mem=function(e,t){switch(this.dbg_log_fpu_op(221,e),e>>3&7){case 0:e=this.load_m64(t),this.push(e);break;case 1:this.fpu_unimpl();break;case 2:this.store_m64(t,0);break;case 3:this.store_m64(t,0),this.pop();break;case 4:this.frstor(t);break;case 5:this.fpu_unimpl();break;case 6:this.fsave(t);break;case 7:this.cpu.safe_write16(t,this.load_status_word());break;default:dbg_assert(!1)}},FPU.prototype.op_DE_reg=function(e){this.dbg_log_fpu_op(222,e);var t=e>>3&7;e&=7;var s=this.stack_ptr+e&7,r=this.get_sti(e),i=this.get_st0();switch(t){case 0:this.st[s]=r+i;break;case 1:this.st[s]=r*i;break;case 2:this.fcom(r);break;case 3:1===e?(this.fcom(this.st[s]),this.pop()):(dbg_log(t),this.fpu_unimpl());break;case 4:this.st[s]=i-r;break;case 5:this.st[s]=r-i;break;case 6:this.st[s]=i/r;break;case 7:this.st[s]=r/i;break;default:dbg_assert(!1)}this.pop()},FPU.prototype.op_DE_mem=function(e,t){this.dbg_log_fpu_op(222,e),e=e>>3&7,t=this.cpu.safe_read16(t)<<16>>16;var s=this.get_st0();switch(e){case 0:this.st[this.stack_ptr]=s+t;break;case 1:this.st[this.stack_ptr]=s*t;break;case 2:this.fcom(t);break;case 3:this.fcom(t),this.pop();break;case 4:this.st[this.stack_ptr]=s-t;break;case 5:this.st[this.stack_ptr]=t-s;break;case 6:this.st[this.stack_ptr]=s/t;break;case 7:this.st[this.stack_ptr]=t/s;break;default:dbg_assert(!1)}},FPU.prototype.op_DF_reg=function(e){this.dbg_log_fpu_op(223,e);var t=e>>3&7,s=7&e;switch(t){case 4:224===e?this.cpu.reg16[reg_ax]=this.load_status_word():(dbg_log(e),this.fpu_unimpl());break;case 5:this.fucomi(this.get_sti(s)),this.pop();break;case 6:this.fcomi(this.get_sti(s)),this.pop();break;default:dbg_log(t),this.fpu_unimpl()}},FPU.prototype.op_DF_mem=function(e,t){switch(this.dbg_log_fpu_op(223,e),e>>3&7){case 0:t=this.cpu.safe_read16(t)<<16>>16,this.push(t);break;case 1:this.fpu_unimpl();break;case 2:e=this.integer_round(this.get_st0()),32767>=e&&-32768<=e?this.cpu.safe_write16(t,e):(this.invalid_arithmatic(),this.cpu.safe_write16(t,32768));break;case 3:e=this.integer_round(this.get_st0()),32767>=e&&-32768<=e?this.cpu.safe_write16(t,e):(this.invalid_arithmatic(),this.cpu.safe_write16(t,32768)),this.pop();break;case 4:this.fpu_unimpl();break;case 5:e=this.cpu.safe_read32s(t)>>>0,t=this.cpu.safe_read32s(t+4),this.push(e+4294967296*t);break;case 6:this.fpu_unimpl();break;case 7:if(this.cpu.writable_or_pagefault(t,8),(e=this.integer_round(this.get_st0()))<TWO_POW_63&&e>=-TWO_POW_63){var s=0|e,r=e/4294967296|0;0===r&&0>e&&(r=-1)}else s=0,r=-2147483648,this.invalid_arithmatic();this.cpu.safe_write32(t,s),this.cpu.safe_write32(t+4,r),this.pop();break;default:dbg_assert(!1)}};var CDROM_SECTOR_SIZE=2048,HD_SECTOR_SIZE=512;IDEDevice.prototype.read_status=function(){if(this.current_interface.buffer){var e=this.current_interface.status;return dbg_log("ATA read status: "+h(e,2),LOG_DISK),e}return 0},IDEDevice.prototype.write_control=function(e){dbg_log("set device control: "+h(e,2)+" interrupts "+(2&e?"disabled":"enabled"),LOG_DISK),4&e&&(dbg_log("Reset via control port",LOG_DISK),this.cpu.device_lower_irq(this.irq),this.master.device_reset(),this.slave.device_reset()),this.device_control=e},IDEDevice.prototype.dma_read_addr=function(){return dbg_log("dma get address: "+h(this.prdt_addr,8),LOG_DISK),this.prdt_addr},IDEDevice.prototype.dma_set_addr=function(e){dbg_log("dma set address: "+h(e,8),LOG_DISK),this.prdt_addr=e},IDEDevice.prototype.dma_read_status=function(){return dbg_log("DMA read status: "+h(this.dma_status),LOG_DISK),this.dma_status},IDEDevice.prototype.dma_write_status=function(e){dbg_log("DMA set status: "+h(e),LOG_DISK),this.dma_status&=~(6&e)},IDEDevice.prototype.dma_read_command=function(){return this.dma_read_command8()|this.dma_read_status()<<16},IDEDevice.prototype.dma_read_command8=function(){return dbg_log("DMA read command: "+h(this.dma_command),LOG_DISK),this.dma_command},IDEDevice.prototype.dma_write_command=function(e){dbg_log("DMA write command: "+h(e),LOG_DISK),this.dma_write_command8(255&e),this.dma_write_status(e>>16&255)},IDEDevice.prototype.dma_write_command8=function(e){dbg_log("DMA write command8: "+h(e),LOG_DISK);var t=this.dma_command;if(this.dma_command=9&e,(1&t)!=(1&e))if(0==(1&e))this.dma_status&=-2;else switch(this.dma_status|=1,this.current_interface.current_command){case 37:case 200:this.current_interface.do_ata_read_sectors_dma();break;case 202:case 53:this.current_interface.do_ata_write_sectors_dma();break;case 160:this.current_interface.do_atapi_dma();break;default:dbg_log("Spurious dma command write, current command: "+h(this.current_interface.current_command),LOG_DISK),dbg_assert(!1)}},IDEDevice.prototype.push_irq=function(){0==(2&this.device_control)&&(dbg_log("push irq",LOG_DISK),this.dma_status|=4,this.cpu.device_raise_irq(this.irq))},IDEDevice.prototype.get_state=function(){var e=[];return e[0]=this.master,e[1]=this.slave,e[2]=this.ata_port,e[3]=this.irq,e[4]=this.pci_id,e[5]=this.ata_port_high,e[6]=this.master_port,e[7]=this.name,e[8]=this.device_control,e[9]=this.prdt_addr,e[10]=this.dma_status,e[11]=this.current_interface===this.master,e[12]=this.dma_command,e},IDEDevice.prototype.set_state=function(e){this.master=e[0],this.slave=e[1],this.ata_port=e[2],this.irq=e[3],this.pci_id=e[4],this.ata_port_high=e[5],this.master_port=e[6],this.name=e[7],this.device_control=e[8],this.prdt_addr=e[9],this.dma_status=e[10],this.current_interface=e[11]?this.master:this.slave,this.dma_command=e[12]},IDEInterface.prototype.device_reset=function(){this.is_atapi?(this.status=0,this.sector=this.error=this.bytecount=1,this.cylinder_low=20,this.cylinder_high=235):(this.status=81,this.sector=this.error=this.bytecount=1,this.cylinder_high=this.cylinder_low=0)},IDEInterface.prototype.push_irq=function(){this.device.push_irq()},IDEInterface.prototype.ata_command=function(e){if(dbg_log("ATA Command: "+h(e)+" slave="+(this.drive_head>>4&1),LOG_DISK),this.buffer)switch(this.current_command=e,this.error=0,e){case 8:dbg_log("ATA device reset",LOG_DISK),this.data_length=this.data_end=this.data_pointer=0,this.device_reset(),this.push_irq();break;case 16:this.status=80,this.cylinder_low=0,this.push_irq();break;case 248:this.status=80,e=this.sector_count-1,this.sector=255&e,this.cylinder_low=e>>8&255,this.cylinder_high=e>>16&255,this.drive_head=240&this.drive_head|e>>24&15,this.push_irq();break;case 39:this.status=80,e=this.sector_count-1,this.sector=255&e,this.cylinder_low=e>>8&255,this.cylinder_high=e>>16&255,this.sector|=e>>24<<8&65280,this.push_irq();break;case 32:case 36:case 41:case 196:this.ata_read_sectors(e);break;case 48:case 52:case 57:case 197:this.ata_write_sectors(e);break;case 144:this.push_irq(),this.error=257,this.status=80;break;case 145:this.status=80,this.push_irq();break;case 160:this.is_atapi&&(this.status=88,this.data_allocate(12),this.data_end=12,this.bytecount=1,this.push_irq());break;case 161:dbg_log("ATA identify packet device",LOG_DISK),this.is_atapi?(this.create_identify_packet(),this.status=88,this.cylinder_low=20,this.cylinder_high=235):this.status=65,this.push_irq();break;case 198:dbg_log("Logical sectors per DRQ Block: "+h(255&this.bytecount),LOG_DISK),this.sectors_per_drq=255&this.bytecount,this.status=80,this.push_irq();break;case 37:case 200:this.ata_read_sectors_dma(e);break;case 53:case 202:this.ata_write_sectors_dma(e);break;case 64:dbg_log("read verify sectors",LOG_DISK),this.status=80,this.push_irq();break;case 218:dbg_log("Unimplemented: get media status",LOG_DISK),this.status=65,this.error=4,this.push_irq();break;case 224:dbg_log("ATA standby immediate",LOG_DISK),this.status=80,this.push_irq();break;case 225:dbg_log("ATA idle immediate",LOG_DISK),this.status=80,this.push_irq();break;case 231:dbg_log("ATA flush cache",LOG_DISK),this.status=80,this.push_irq();break;case 236:if(dbg_log("ATA identify device",LOG_DISK),this.is_atapi){this.status=65,this.error=4,this.push_irq();break}this.create_identify_packet(),this.status=88,this.push_irq();break;case 234:dbg_log("flush cache ext",LOG_DISK),this.status=80,this.push_irq();break;case 239:dbg_log("set features: "+h(255&this.bytecount),LOG_DISK),this.status=80,this.push_irq();break;case 245:dbg_log("security freeze lock",LOG_DISK),this.status=80,this.push_irq();break;case 249:dbg_log("Unimplemented: set max address",LOG_DISK),this.status=65,this.error=4;break;default:dbg_assert(!1,"New ATA cmd on 1F7: "+h(e),LOG_DISK),this.status=65,this.error=4}else dbg_log("abort: No buffer",LOG_DISK),this.error=4,this.status=65,this.push_irq()},IDEInterface.prototype.atapi_handle=function(){switch(dbg_log("ATAPI Command: "+h(this.data[0])+" slave="+(this.drive_head>>4&1),LOG_DISK),this.data_pointer=0,this.current_atapi_command=this.data[0],this.current_atapi_command){case 0:dbg_log("test unit ready",LOG_DISK),this.data_allocate(0),this.data_end=this.data_length,this.status=80;break;case 3:this.data_allocate(this.data[4]),this.data_end=this.data_length,this.status=88,this.data[0]=240,this.data[2]=5,this.data[7]=8;break;case 18:var e=this.data[4];this.status=88,dbg_log("inquiry: "+h(this.data[1],2)+" length="+e,LOG_DISK),this.data.set([5,128,1,49,31,0,0,0,83,79,78,89,32,32,32,32,67,68,45,82,79,77,32,67,68,85,45,49,48,48,48,32,49,46,49,97]),this.data_end=this.data_length=Math.min(36,e);break;case 26:this.data_allocate(this.data[4]),this.data_end=this.data_length,this.status=88;break;case 30:this.data_allocate(0),this.data_end=this.data_length,this.status=80;break;case 37:e=this.sector_count-1,this.data_set(new Uint8Array([e>>24&255,e>>16&255,e>>8&255,255&e,0,0,this.sector_size>>8&255,255&this.sector_size])),this.data_end=this.data_length,this.status=88;break;case 40:1&this.lba_count?this.atapi_read_dma(this.data):this.atapi_read(this.data);break;case 66:e=this.data[8],this.data_allocate(Math.min(8,e)),this.data_end=this.data_length,dbg_log("read q subcode: length="+e,LOG_DISK),this.status=88;break;case 67:e=this.data[8]|this.data[7]<<8;var t=this.data[9]>>6;this.data_allocate(e),this.data_end=this.data_length,dbg_log("read toc: "+h(t,2)+" length="+e+" "+(2&this.data[1])+" "+h(this.data[6]),LOG_DISK),0===t?(e=this.sector_count,this.data.set(new Uint8Array([0,18,1,1,0,20,1,0,0,0,0,0,0,22,170,0,e>>24,e>>16&255,e>>8&255,255&e]))):1===t?this.data.set(new Uint8Array([0,10,1,1,0,0,0,0,0,0,0,0])):dbg_assert(!1,"Unimplemented format: "+t),this.status=88;break;case 70:e=this.data[8]|this.data[7]<<8,e=Math.min(e,32),this.data_allocate(e),this.data_end=this.data_length,this.data[0]=e-4>>24&255,this.data[1]=e-4>>16&255,this.data[2]=e-4>>8&255,this.data[3]=e-4&255,this.data[6]=8,this.data[10]=3,this.status=88;break;case 81:this.data_allocate(0),this.data_end=this.data_length,this.status=80;break;case 82:dbg_log("Unimplemented ATAPI command: "+h(this.data[0]),LOG_DISK),this.status=81,this.data_length=0,this.error=80;break;case 90:e=this.data[8]|this.data[7]<<8,t=this.data[2],dbg_log("mode sense: "+h(t)+" length="+e,LOG_DISK),42===t&&this.data_allocate(Math.min(30,e)),this.data_end=this.data_length,this.status=88;break;case 189:this.data_allocate(this.data[9]|this.data[8]<<8),this.data_end=this.data_length,this.data[5]=1,this.status=88;break
;case 74:this.status=81,this.data_length=0,this.error=80,dbg_log("Unimplemented ATAPI command: "+h(this.data[0]),LOG_DISK);break;default:this.status=81,this.data_length=0,this.error=80,dbg_log("Unimplemented ATAPI command: "+h(this.data[0]),LOG_DISK),dbg_assert(!1)}this.bytecount=-8&this.bytecount|2,0==(128&this.status)&&this.push_irq(),0==(128&this.status)&&0===this.data_length&&(this.bytecount|=1,this.status&=-9)},IDEInterface.prototype.do_write=function(){this.status=80,dbg_assert(this.data_length<=this.data.length);var e=this.data.subarray(0,this.data_length);dbg_assert(0==this.data_length%512),this.ata_advance(this.current_command,this.data_length/512),this.push_irq(),this.buffer.set(this.write_dest,e,function(){}),this.report_write(this.data_length)},IDEInterface.prototype.atapi_read=function(e){var t=this,s=e[2]<<24|e[3]<<16|e[4]<<8|e[5],r=e[7]<<8|e[8];e=e[1];var i=r*this.sector_size,_=s*this.sector_size;dbg_log("CD read lba="+h(s)+" lbacount="+h(r)+" bytecount="+h(i)+" flags="+h(e),LOG_DISK),this.data_length=0;var a=this.cylinder_high<<8&65280|255&this.cylinder_low;dbg_log(h(this.cylinder_high,2)+" "+h(this.cylinder_low,2),LOG_DISK),this.cylinder_low=this.cylinder_high=0,65535===a&&a--,a>i&&(a=i),_>=this.buffer.byteLength?(dbg_assert(!1,"CD read: Outside of disk end="+h(_+i)+" size="+h(this.buffer.byteLength),LOG_DISK),this.status=255,this.push_irq()):0===i?(this.status=80,this.data_pointer=0):(i=Math.min(i,this.buffer.byteLength-_),this.status=208,this.report_read_start(),this.buffer.get(_,i,function(e){dbg_log("cd read: data arrived",LOG_DISK),t.data_set(e),t.status=88,t.bytecount=-8&t.bytecount|2,t.push_irq(),a&=-4,t.data_end=a,t.data_end>t.data_length&&(t.data_end=t.data_length),t.cylinder_low=255&t.data_end,t.cylinder_high=t.data_end>>8&255,t.report_read_end(i)}))},IDEInterface.prototype.atapi_read_dma=function(e){var t=this,s=e[2]<<24|e[3]<<16|e[4]<<8|e[5],r=e[7]<<8|e[8];e=e[1];var i=r*this.sector_size,_=s*this.sector_size;dbg_log("CD read DMA lba="+h(s)+" lbacount="+h(r)+" bytecount="+h(i)+" flags="+h(e),LOG_DISK),_>=this.buffer.byteLength?(dbg_assert(!1,"CD read: Outside of disk end="+h(_+i)+" size="+h(this.buffer.byteLength),LOG_DISK),this.status=255,this.push_irq()):(this.status=208,this.report_read_start(),this.buffer.get(_,i,function(e){dbg_log("atapi_read_dma: Data arrived"),t.report_read_end(i),t.status=88,t.bytecount=-8&t.bytecount|2,t.data_set(e),t.do_atapi_dma()}))},IDEInterface.prototype.do_atapi_dma=function(){if(0==(1&this.device.dma_status))dbg_log("do_atapi_dma: Status not set",LOG_DISK);else if(0==(8&this.status))dbg_log("do_atapi_dma: DRQ not set",LOG_DISK);else{dbg_log("atapi dma transfer len="+this.data_length,LOG_DISK);var e=this.device.prdt_addr,t=0,s=this.data;do{var r=this.cpu.read32s(e),i=this.cpu.read16(e+4),_=128&this.cpu.read8(e+7);if(i||(i=65536),dbg_log("dma read dest="+h(r)+" count="+h(i)+" datalen="+h(this.data_length),LOG_DISK),this.cpu.write_blob(s.subarray(t,Math.min(t+i,this.data_length)),r),t+=i,e+=8,t>=this.data_length&&!_){dbg_log("leave early end="+ +_+" offset="+h(t)+" data_length="+h(this.data_length)+" cmd="+h(this.current_command),LOG_DISK);break}}while(!_);dbg_log("end offset="+t,LOG_DISK),this.status=80,this.device.dma_status&=-2,this.bytecount=-8&this.bytecount|3,this.push_irq()}},IDEInterface.prototype.read_data=function(e){if(this.data_pointer<this.data_end){dbg_assert(this.data_pointer+e-1<this.data_end),dbg_assert(0==this.data_pointer%e,h(this.data_pointer)+" "+e);var t=1===e?this.data[this.data_pointer]:2===e?this.data16[this.data_pointer>>>1]:this.data32[this.data_pointer>>>2];return this.data_pointer+=e,0==(this.data_pointer&(0==(4095&this.data_end)?4095:255))&&dbg_log("Read 1F0: "+h(this.data[this.data_pointer],2)+" cur="+h(this.data_pointer)+" cnt="+h(this.data_length),LOG_DISK),this.data_pointer>=this.data_end&&this.read_end(),t}return dbg_log("Read 1F0: empty",LOG_DISK),this.data_pointer+=e,0},IDEInterface.prototype.read_end=function(){if(dbg_log("read_end cmd="+h(this.current_command)+" data_pointer="+h(this.data_pointer)+" end="+h(this.data_end)+" length="+h(this.data_length),LOG_DISK),160===this.current_command)if(this.data_end===this.data_length)this.status=80,this.bytecount=-8&this.bytecount|3,this.push_irq();else{this.status=88,this.bytecount=-8&this.bytecount|2,this.push_irq();var e=this.cylinder_high<<8&65280|255&this.cylinder_low;this.data_end+e>this.data_length?(this.cylinder_low=this.data_length-this.data_end&255,this.cylinder_high=this.data_length-this.data_end>>8&255,this.data_end=this.data_length):this.data_end+=e,dbg_log("data_end="+h(this.data_end),LOG_DISK)}else this.error=0,this.data_pointer>=this.data_length?this.status=80:(196===this.current_command||41===this.current_command?(e=Math.min(this.sectors_per_drq,(this.data_length-this.data_end)/512),dbg_assert(0==e%1)):(dbg_assert(32===this.current_command||36===this.current_command),e=1),this.ata_advance(this.current_command,e),this.data_end+=512*e,this.status=88),this.push_irq()},IDEInterface.prototype.write_data_port=function(e,t){dbg_assert(0==this.data_pointer%t),this.data_pointer>=this.data_end?dbg_log("Redundant write to data port: "+h(e)+" count="+h(this.data_end)+" cur="+h(this.data_pointer),LOG_DISK):((0==(this.data_pointer+t&(0==(4095&this.data_end)?4095:255))||20>this.data_end)&&dbg_log("Data port: "+h(e>>>0)+" count="+h(this.data_end)+" cur="+h(this.data_pointer),LOG_DISK),1===t?this.data[this.data_pointer++]=e:2===t?(this.data16[this.data_pointer>>>1]=e,this.data_pointer+=2):(this.data32[this.data_pointer>>>2]=e,this.data_pointer+=4),dbg_assert(this.data_pointer<=this.data_end),this.data_pointer===this.data_end&&this.write_end())},IDEInterface.prototype.write_data_port8=function(e){this.write_data_port(e,1)},IDEInterface.prototype.write_data_port16=function(e){this.write_data_port(e,2)},IDEInterface.prototype.write_data_port32=function(e){this.write_data_port(e,4)},IDEInterface.prototype.write_end=function(){160===this.current_command?this.atapi_handle():(dbg_log("write_end data_pointer="+h(this.data_pointer)+" data_length="+h(this.data_length),LOG_DISK),this.data_pointer>=this.data_length?this.do_write():(dbg_assert(48===this.current_command||52===this.current_command),this.status=88,this.data_end+=512,this.push_irq()))},IDEInterface.prototype.ata_advance=function(e,t){dbg_log("Advance sectors="+t+" old_bytecount="+this.bytecount,LOG_DISK),this.bytecount-=t,36===e||41===e||52===e||57===e||37===e||53===e?(e=t+this.get_lba48(),this.sector=255&e|e>>16&65280,this.cylinder_low=e>>8&255,this.cylinder_high=e>>16&255):this.is_lba?(e=t+this.get_lba28(),this.sector=255&e,this.cylinder_low=e>>8&255,this.cylinder_high=e>>16&255,this.head=-16&this.head|15&e):(e=t+this.get_chs(),t=e/(this.head_count*this.sectors_per_track)|0,this.cylinder_low=255&t,this.cylinder_high=t>>8&255,this.head=(e/this.sectors_per_track|0)%this.head_count&15,this.sector=e%this.sectors_per_track+1&255,dbg_assert(e===this.get_chs()))},IDEInterface.prototype.ata_read_sectors=function(e){var t=this,s=36===e||41===e,r=this.get_count(s);s=this.get_lba(s);var i=32===e||36===e,_=r*this.sector_size,a=s*this.sector_size;dbg_log("ATA read cmd="+h(e)+" mode="+(this.is_lba?"lba":"chs")+" lba="+h(s)+" lbacount="+h(r)+" bytecount="+h(_),LOG_DISK),a+_>this.buffer.byteLength?(dbg_assert(!1,"ATA read: Outside of disk",LOG_DISK),this.status=255,this.push_irq()):(this.status=192,this.report_read_start(),this.buffer.get(a,_,function(s){dbg_log("ata_read: Data arrived",LOG_DISK),t.data_set(s),t.status=88,t.data_end=i?512:Math.min(_,512*t.sectors_per_drq),t.ata_advance(e,i?1:Math.min(r,t.sectors_per_track)),t.push_irq(),t.report_read_end(_)}))},IDEInterface.prototype.ata_read_sectors_dma=function(e){var t=37===e;e=this.get_count(t),t=this.get_lba(t);var s=e*this.sector_size,r=t*this.sector_size;dbg_log("ATA DMA read lba="+h(t)+" lbacount="+h(e)+" bytecount="+h(s),LOG_DISK),r+s>this.buffer.byteLength?(dbg_assert(!1,"ATA read: Outside of disk",LOG_DISK),this.status=255,this.push_irq()):(this.status=88,this.device.dma_status|=1)},IDEInterface.prototype.do_ata_read_sectors_dma=function(){var e=this,t=37===this.current_command,s=this.get_count(t);t=this.get_lba(t);var r=s*this.sector_size,i=t*this.sector_size;dbg_assert(t<this.buffer.byteLength),this.report_read_start();var _=this.device.prdt_addr;this.buffer.get(i,r,function(t){dbg_log("do_ata_read_sectors_dma: Data arrived",LOG_DISK);var i=e.device.prdt_addr,a=0;dbg_assert(_===i);do{var o=e.cpu.read32s(i),n=e.cpu.read16(i+4),d=128&e.cpu.read8(i+7);n||(n=65536,dbg_log("dma: prd count was 0",LOG_DISK)),dbg_log("dma read transfer dest="+h(o)+" prd_count="+h(n),LOG_DISK),e.cpu.write_blob(t.subarray(a,a+n),o),a+=n,i+=8}while(!d);dbg_assert(a===r),e.ata_advance(e.current_command,s),e.status=80,e.device.dma_status&=-2,e.current_command=-1,e.push_irq(),e.report_read_end(r)})},IDEInterface.prototype.ata_write_sectors=function(e){var t=52===e||57===e,s=this.get_count(t);t=this.get_lba(t),e=48===e||52===e;var r=s*this.sector_size,i=t*this.sector_size;dbg_log("ATA write lba="+h(t)+" mode="+(this.is_lba?"lba":"chs")+" lbacount="+h(s)+" bytecount="+h(r),LOG_DISK),i+r>this.buffer.byteLength?(dbg_assert(!1,"ATA write: Outside of disk",LOG_DISK),this.status=255,this.push_irq()):(this.status=88,this.data_allocate_noclear(r),this.data_end=e?512:Math.min(r,512*this.sectors_per_drq),this.write_dest=i)},IDEInterface.prototype.ata_write_sectors_dma=function(e){var t=53===e;e=this.get_count(t),t=this.get_lba(t);var s=e*this.sector_size,r=t*this.sector_size;dbg_log("ATA DMA write lba="+h(t)+" lbacount="+h(e)+" bytecount="+h(s),LOG_DISK),r+s>this.buffer.byteLength?(dbg_assert(!1,"ATA DMA write: Outside of disk",LOG_DISK),this.status=255,this.push_irq()):(this.status=88,this.device.dma_status|=1)},IDEInterface.prototype.do_ata_write_sectors_dma=function(){var e=53===this.current_command,t=this.get_count(e),s=this.get_lba(e);e=t*this.sector_size,s*=this.sector_size;var r=this.device.prdt_addr,i=0,_=0,a=0;dbg_log("prdt addr: "+h(r,8),LOG_DISK);do{var o=this.cpu.read32s(r),n=this.cpu.read16(r+4),d=128&this.cpu.read8(r+7);n||(n=65536,dbg_log("dma: prd count was 0",LOG_DISK)),dbg_log("dma write transfer dest="+h(o)+" prd_count="+h(n),LOG_DISK),o=this.cpu.mem8.subarray(o,o+n),dbg_assert(o.length===n),this.buffer.set(s+a,o,function(){_++}),a+=n,r+=8,i++}while(!d);_===i?(dbg_log("dma write completed",LOG_DISK),this.ata_advance(this.current_command,t),this.status=80,this.push_irq(),this.device.dma_status&=-2,this.current_command=-1):dbg_assert(!1,"dma write not completed",LOG_DISK),this.report_write(e)},IDEInterface.prototype.get_chs=function(){var e=255&this.cylinder_low|this.cylinder_high<<8&65280,t=this.head,s=255&this.sector;return dbg_log("get_chs: c="+e+" h="+t+" s="+s,LOG_DISK),(e*this.head_count+t)*this.sectors_per_track+s-1},IDEInterface.prototype.get_lba28=function(){return 255&this.sector|this.cylinder_low<<8&65280|this.cylinder_high<<16&16711680|(15&this.head)<<24},IDEInterface.prototype.get_lba48=function(){return(255&this.sector|this.cylinder_low<<8&65280|this.cylinder_high<<16&16711680|this.sector>>8<<24&4278190080)>>>0},IDEInterface.prototype.get_lba=function(e){return e?this.get_lba48():this.is_lba?this.get_lba28():this.get_chs()},IDEInterface.prototype.get_count=function(e){return e?0===(e=this.bytecount)&&(e=65536):0===(e=255&this.bytecount)&&(e=256),e},IDEInterface.prototype.create_identify_packet=function(){if(16&this.drive_head)this.data_allocate(0);else{for(var e=0;512>e;e++)this.data[e]=0;e=Math.min(16383,this.cylinder_count),this.data_set([64,this.is_atapi?133:0,e,e>>8,0,0,this.head_count,this.head_count>>8,this.sectors_per_track/512,this.sectors_per_track/512>>8,0,2,this.sectors_per_track,this.sectors_per_track>>8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,4,0,0,0,0,0,0,0,0,0,56,118,32,54,68,72,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,128,0,1,0,0,2,0,0,0,2,0,2,7,0,e,e>>8,this.head_count,this.head_count>>8,this.sectors_per_track,0,255&this.sector_count,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255,0,0,255&this.sector_count,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255,0,0,160===this.current_command?0:7,160===this.current_command?0:4,0,0,30,0,30,0,30,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,116,0,64,0,64,0,116,0,64,0,0,0,0,0,0,0,0,0,0,1,96,0,0,0,0,0,0,0,0,0,0,0,0,255&this.sector_count,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255]),this.data_end=this.data_length=512}},IDEInterface.prototype.data_allocate=function(e){this.data_allocate_noclear(e);for(var t=0;t<e+3>>2;t++)this.data32[t]=0},IDEInterface.prototype.data_allocate_noclear=function(e){this.data.length<e&&(this.data=new Uint8Array(e+3&-4),this.data16=new Uint16Array(this.data.buffer),this.data32=new Int32Array(this.data.buffer)),this.data_length=e,this.data_pointer=0},IDEInterface.prototype.data_set=function(e){this.data_allocate_noclear(e.length),this.data.set(e)},IDEInterface.prototype.report_read_start=function(){this.stats.loading=!0,this.bus.send("ide-read-start")},IDEInterface.prototype.report_read_end=function(e){this.stats.loading=!1;var t=e/this.sector_size|0;this.stats.sectors_read+=t,this.stats.bytes_read+=e,this.bus.send("ide-read-end",[this.nr,e,t])},IDEInterface.prototype.report_write=function(e){var t=e/this.sector_size|0;this.stats.sectors_written+=t,this.stats.bytes_written+=e,this.bus.send("ide-write-end",[this.nr,e,t])},IDEInterface.prototype.get_state=function(){var e=[];return e[0]=this.bytecount,e[1]=this.cylinder_count,e[2]=this.cylinder_high,e[3]=this.cylinder_low,e[4]=this.data_pointer,e[5]=0,e[6]=0,e[7]=0,e[8]=0,e[9]=this.drive_head,e[10]=this.error,e[11]=this.head,e[12]=this.head_count,e[13]=this.is_atapi,e[14]=this.is_lba,e[15]=this.lba_count,e[16]=this.data,e[17]=this.data_length,e[18]=this.sector,e[19]=this.sector_count,e[20]=this.sector_size,e[21]=this.sectors_per_drq,e[22]=this.sectors_per_track,e[23]=this.status,e[24]=this.write_dest,e[25]=this.current_command,e[26]=this.data_end,e[27]=this.current_atapi_command,e},IDEInterface.prototype.set_state=function(e){this.bytecount=e[0],this.cylinder_count=e[1],this.cylinder_high=e[2],this.cylinder_low=e[3],this.data_pointer=e[4],this.drive_head=e[9],this.error=e[10],this.head=e[11],this.head_count=e[12],this.is_atapi=e[13],this.is_lba=e[14],this.lba_count=e[15],this.data=e[16],this.data_length=e[17],this.sector=e[18],this.sector_count=e[19],this.sector_size=e[20],this.sectors_per_drq=e[21],this.sectors_per_track=e[22],this.status=e[23],this.write_dest=e[24],this.current_command=e[25],this.data_end=e[26],this.current_atapi_command=e[27],this.data16=new Uint16Array(this.data.buffer),this.data32=new Int32Array(this.data.buffer)};var PCI_CONFIG_ADDRESS=3320,PCI_CONFIG_DATA=3324;PCI.prototype.get_state=function(){for(var e=[],t=0;256>t;t++)e[t]=this.device_spaces[t];return e[256]=this.pci_addr,e[257]=this.pci_value,e[258]=this.pci_response,e[259]=this.pci_status,e},PCI.prototype.set_state=function(e){for(var t=0;256>t;t++){var s=this.devices[t],r=e[t];if(s&&r){for(var i=0;i<s.pci_bars.length;i++){var _=r[4+i];if(1&_){var a=s.pci_bars[i];this.set_io_bars(a,65534&a.original_bar,65534&_)}}this.device_spaces[t].set(r)}else s&&dbg_log("Warning: While restoring PCI device: Device exists in current configuration but not in snapshot ("+s.name+")"),r&&dbg_log("Warning: While restoring PCI device: Device doesn't exist in current configuration but does in snapshot (device "+h(t,2)+")")}this.pci_addr.set(e[256]),this.pci_value.set(e[257]),this.pci_response.set(e[258]),this.pci_status.set(e[259])},PCI.prototype.pci_query=function(){var e=this.pci_addr[2]<<8|this.pci_addr[1],t=252&this.pci_addr[0],s=e>>3&31,r="query enabled="+(this.pci_addr[3]>>7)+" bdf="+h(e,4);r+=" dev="+h(s,2),r+=" addr="+h(t,2),s=this.device_spaces[e],void 0!==s?(this.pci_status32[0]=-2147483648,this.pci_response32[0]=t<s.byteLength?s[t>>2]:0,r+=" "+h(this.pci_addr32[0]>>>0,8)+" -> "+h(this.pci_response32[0]>>>0,8),t>=s.byteLength&&(r+=" (undef)"),r+=" ("+this.devices[e].name+")",dbg_log(r,LOG_PCI)):(this.pci_response32[0]=-1,this.pci_status32[0]=0)},PCI.prototype.pci_write8=function(e,t){var s=e>>8&65535;e&=255;var r=new Uint8Array(this.device_spaces[s].buffer),i=this.devices[s];r&&(dbg_assert(!(16<=e&&44>e||48<=e&&52>e),"PCI: Expected 32-bit write"),dbg_log("PCI write8 dev="+h(s>>3,2)+" ("+i.name+") addr="+h(e,4)+" value="+h(t,2),LOG_PCI),r[e]=t)},PCI.prototype.pci_write16=function(e,t){dbg_assert(0==(1&e));var s=e>>8&65535;e&=255;var r=new Uint16Array(this.device_spaces[s].buffer),i=this.devices[s];r&&(dbg_assert(!(16<=e&&44>e||48<=e&&52>e),"PCI: Expected 32-bit write"),dbg_log("PCI writ16 dev="+h(s>>3,2)+" ("+i.name+") addr="+h(e,4)+" value="+h(t,4),LOG_PCI),r[e>>>1]=t)},PCI.prototype.pci_write32=function(e,t){dbg_assert(0==(3&e));var s=e>>8&65535;e&=255;var r=this.device_spaces[s],i=this.devices[s];if(r)if(16<=e&&40>e){var _=e-16>>2,a=i.pci_bars[_];dbg_log("BAR"+_+" exists="+(a?"y":"n")+" changed to "+h(t>>>0)+" dev="+h(s>>3,2)+" ("+i.name+") ",LOG_PCI),a?(dbg_assert(!(a.size&a.size-1),"bar size should be power of 2"),s=e>>2,i=1&r[s],-1==(3|t|a.size-1)?(t=~(a.size-1)|i,0===i&&(r[s]=t)):0===i&&(_=a.original_bar,(-16&t)!=(-16&_)&&dbg_log("Warning: Changing memory bar not supported, ignored",LOG_PCI),r[s]=_),1===i&&(dbg_assert(1===i),i=65534&r[s],_=65534&t,dbg_log("io bar changed from "+h(i>>>0,8)+" to "+h(_>>>0,8)+" size="+a.size,LOG_PCI),this.set_io_bars(a,i,_),r[s]=1|t)):r[e>>2]=0,dbg_log("BAR effective value: "+h(r[e>>2]>>>0),LOG_PCI)}else 48===e?(dbg_log("PCI write rom address dev="+h(s>>3,2)+" ("+i.name+") value="+h(t>>>0,8),LOG_PCI),r[e>>2]=i.pci_rom_size?-1==(2047|t)?0|-i.pci_rom_size:0|i.pci_rom_address:0):(dbg_log("PCI write dev="+h(s>>3,2)+" ("+i.name+") addr="+h(e,4)+" value="+h(t>>>0,8),LOG_PCI),r[e>>>2]=t)},PCI.prototype.register_device=function(e){dbg_assert(void 0!==e.pci_id),dbg_assert(void 0!==e.pci_space),dbg_assert(void 0!==e.pci_bars);var t=e.pci_id;dbg_log("PCI register bdf="+h(t)+" ("+e.name+")",LOG_PCI),dbg_assert(!this.devices[t]),dbg_assert(64<=e.pci_space.length),dbg_assert(t<this.devices.length);var s=new Int32Array(64);s.set(new Int32Array(new Uint8Array(e.pci_space).buffer)),this.device_spaces[t]=s,this.devices[t]=e,t=s.slice(4,10);for(var r=0;r<e.pci_bars.length;r++){var i=e.pci_bars[r];if(i){var _=t[r],a=1&_;if(i.original_bar=_,i.entries=[],0!==a)for(dbg_assert(1===a),_&=-2,a=0;a<i.size;a++)i.entries[a]=this.io.ports[_+a]}}return s},PCI.prototype.set_io_bars=function(e,t,s){var r=e.size;dbg_log("Move io bars: from="+h(t)+" to="+h(s)+" count="+r,LOG_PCI);for(var i=this.io.ports,_=0;_<r;_++){var a=i[t+_];i[t+_]=this.io.create_empty_entry(),a.read8===this.io.empty_port_read8&&a.read16===this.io.empty_port_read16&&a.read32===this.io.empty_port_read32&&a.write8===this.io.empty_port_write&&a.write16===this.io.empty_port_write&&a.write32===this.io.empty_port_write&&dbg_log("Move IO bar: Source not mapped, port="+h(t+_,4),LOG_PCI),a=e.entries[_];var o=i[s+_];dbg_assert(a&&o),i[s+_]=a,dbg_assert(o.read8===this.io.empty_port_read8,"Bad IO bar: Target already mapped"),dbg_assert(o.read16===this.io.empty_port_read16,"Bad IO bar: Target already mapped"),dbg_assert(o.read32===this.io.empty_port_read32,"Bad IO bar: Target already mapped"),dbg_assert(o.write8===this.io.empty_port_write,"Bad IO bar: Target already mapped"),dbg_assert(o.write16===this.io.empty_port_write,"Bad IO bar: Target already mapped"),dbg_assert(o.write32===this.io.empty_port_write,"Bad IO bar: Target already mapped")}},PCI.prototype.raise_irq=function(e){var t=this.device_spaces[e];dbg_assert(t),this.cpu.device_raise_irq(this.isa_bridge_space8[96+((t[15]>>8&255)-1+((e>>3)-1&255)&3)])},PCI.prototype.lower_irq=function(e){var t=this.device_spaces[e];dbg_assert(t),this.cpu.device_lower_irq(this.isa_bridge_space8[96+((t[15]>>8&255)+(e>>3&255)-2&3)])},FloppyController.prototype.get_state=function(){var e=[];return e[0]=this.bytes_expecting,e[1]=this.receiving_command,e[2]=this.receiving_index,e[4]=this.response_data,e[5]=this.response_index,e[6]=this.response_length,e[7]=this.floppy_size,e[8]=this.status_reg0,e[9]=this.status_reg1,e[10]=this.status_reg2,e[11]=this.drive,e[12]=this.last_cylinder,e[13]=this.last_head,e[14]=this.last_sector,e[15]=this.dor,e[16]=this.sectors_per_track,e[17]=this.number_of_heads,e[18]=this.number_of_cylinders,e},FloppyController.prototype.set_state=function(e){this.bytes_expecting=e[0],this.receiving_command=e[1],this.receiving_index=e[2],this.next_command=e[3],this.response_data=e[4],this.response_index=e[5],this.response_length=e[6],this.floppy_size=e[7],this.status_reg0=e[8],this.status_reg1=e[9],this.status_reg2=e[10],this.drive=e[11],this.last_cylinder=e[12],this.last_head=e[13],this.last_sector=e[14],this.dor=e[15],this.sectors_per_track=e[16],this.number_of_heads=e[17],this.number_of_cylinders=e[18]},FloppyController.prototype.port3F0_read=function(){return dbg_log("3F0 read",LOG_FLOPPY),0},FloppyController.prototype.port3F4_read=function(){dbg_log("3F4 read",LOG_FLOPPY);var e=128;return this.response_index<this.response_length&&(e|=80),0==(8&this.dor)&&(e|=32),e},FloppyController.prototype.port3F7_read=function(){return dbg_log("3F7 read",LOG_FLOPPY),0},FloppyController.prototype.port3F5_read=function(){return this.response_index<this.response_length?(dbg_log("3F5 read: "+this.response_data[this.response_index],LOG_FLOPPY),this.cpu.device_lower_irq(6),this.response_data[this.response_index++]):(dbg_log("3F5 read, empty",LOG_FLOPPY),255)},FloppyController.prototype.port3F5_write=function(e){if(this.fda_image)if(dbg_log("3F5 write "+h(e),LOG_FLOPPY),0<this.bytes_expecting){if(this.receiving_command[this.receiving_index++]=e,0===--this.bytes_expecting){if(DEBUG){e="3F5 command received: ";for(var t=0;t<this.receiving_index;t++)e+=h(this.receiving_command[t])+" ";dbg_log(e,LOG_FLOPPY)}this.next_command.call(this,this.receiving_command)}}else{switch(e){case 3:this.next_command=this.fix_drive_data,this.bytes_expecting=2;break;case 4:this.next_command=this.check_drive_status,this.bytes_expecting=1;break;case 5:case 197:this.next_command=function(e){this.do_sector(!0,e)},this.bytes_expecting=8;break;case 230:this.next_command=function(e){this.do_sector(!1,e)},this.bytes_expecting=8;break;case 7:this.next_command=this.calibrate,this.bytes_expecting=1;break;case 8:this.check_interrupt_status();break;case 74:this.next_command=this.read_sector_id,this.bytes_expecting=1;break;case 15:this.bytes_expecting=2,this.next_command=this.seek;break;case 14:dbg_log("dump registers",LOG_FLOPPY),this.response_data[0]=128,this.response_index=0,this.response_length=1,this.bytes_expecting=0;break;default:dbg_assert(!1,"Unimplemented floppy command call "+h(e))}this.receiving_index=0}},FloppyController.prototype.port3F2_read=function(){return dbg_log("read 3F2: DOR",LOG_FLOPPY),this.dor},FloppyController.prototype.port3F2_write=function(e){4==(4&e)&&0==(4&this.dor)&&this.cpu.device_raise_irq(6),dbg_log("start motors: "+h(e>>4),LOG_FLOPPY),dbg_log("enable dma: "+!!(8&e),LOG_FLOPPY),dbg_log("reset fdc: "+!!(4&e),LOG_FLOPPY),dbg_log("drive select: "+(3&e),LOG_FLOPPY),dbg_log("DOR = "+h(e),LOG_FLOPPY),this.dor=e},FloppyController.prototype.check_drive_status=function(e){dbg_log("check drive status",LOG_FLOPPY),this.response_index=0,this.response_length=1,this.response_data[0]=32},FloppyController.prototype.seek=function(e){dbg_log("seek",LOG_FLOPPY),dbg_assert(0==(3&e[0]),"Unhandled seek drive"),this.last_cylinder=e[1],this.last_head=e[0]>>2&1,this.raise_irq()},FloppyController.prototype.calibrate=function(e){dbg_log("floppy calibrate",LOG_FLOPPY),this.raise_irq()},FloppyController.prototype.check_interrupt_status=function(){dbg_log("floppy check interrupt status",LOG_FLOPPY),this.response_index=0,this.response_length=2,this.response_data[0]=32,this.response_data[1]=this.last_cylinder},FloppyController.prototype.do_sector=function(e,t){var s=t[2],r=t[1],i=t[3],_=128<<t[4],a=t[5]-t[3]+1,o=((s+this.number_of_heads*r)*this.sectors_per_track+i-1)*_;dbg_log("Floppy "+(e?"Write":"Read"),LOG_FLOPPY),dbg_log("from "+h(o)+" length "+h(a*_),LOG_FLOPPY),dbg_log(r+" / "+s+" / "+i,LOG_FLOPPY),t[4]||dbg_log("FDC: sector count is zero, use data length instead",LOG_FLOPPY),this.fda_image&&(e?this.dma.do_write(this.fda_image,o,a*_,2,this.done.bind(this,t,r,s,i)):this.dma.do_read(this.fda_image,o,a*_,2,this.done.bind(this,t,r,s,i)))},FloppyController.prototype.done=function(e,t,s,r,i){i||(r++,r>this.sectors_per_track&&(r=1,++s>=this.number_of_heads&&(s=0,t++)),this.last_cylinder=t,this.last_head=s,this.last_sector=r,this.response_index=0,this.response_length=7,this.response_data[0]=s<<2|32,this.response_data[1]=0,this.response_data[2]=0,this.response_data[3]=t,this.response_data[4]=s,this.response_data[5]=r,this.response_data[6]=e[4],this.raise_irq())},FloppyController.prototype.fix_drive_data=function(e){dbg_log("floppy fix drive data "+e,LOG_FLOPPY)},FloppyController.prototype.read_sector_id=function(e){dbg_log("floppy read sector id "+e,LOG_FLOPPY),this.response_index=0,this.response_length=7,this.response_data[0]=0,this.response_data[1]=0,this.response_data[2]=0,this.response_data[3]=0,this.response_data[4]=0,this.response_data[5]=0,this.response_data[6]=0,this.raise_irq()},FloppyController.prototype.raise_irq=function(){8&this.dor&&this.cpu.device_raise_irq(6)};var A20_MASK=-1048577,A20_MASK16=-524289,A20_MASK32=-262145,USE_A20=!1;CPU.prototype.debug_write=function(e,t,s){DEBUG&&(dbg_assert("number"==typeof s&&!isNaN(s)),dbg_assert(-2147483648<=s&&2147483648>e),this.debug_read(e,t,!0))},CPU.prototype.debug_read=function(e,t,s){DEBUG&&(dbg_assert("number"==typeof e),dbg_assert(!isNaN(e)))},CPU.prototype.mmap_read8=function(e){return this.memory_map_read8[e>>>MMAP_BLOCK_BITS](e)},CPU.prototype.mmap_write8=function(e,t){this.memory_map_write8[e>>>MMAP_BLOCK_BITS](e,t)},CPU.prototype.mmap_read16=function(e){var t=this.memory_map_read8[e>>>MMAP_BLOCK_BITS];return t(e)|t(e+1|0)<<8},CPU.prototype.mmap_write16=function(e,t){var s=this.memory_map_write8[e>>>MMAP_BLOCK_BITS];s(e,255&t),s(e+1|0,t>>8&255)},CPU.prototype.mmap_read32=function(e){return this.memory_map_read32[e>>>MMAP_BLOCK_BITS](e)},CPU.prototype.mmap_write32=function(e,t){this.memory_map_write32[e>>>MMAP_BLOCK_BITS](e,t)},CPU.prototype.in_mapped_range=function(e){return 655360<=(0|e)&&786432>(0|e)||e>>>0>=this.memory_size>>>0},CPU.prototype.read8=function(e){return this.debug_read(e,1),USE_A20&&!this.a20_enabled&&(e&=A20_MASK),this.in_mapped_range(e)?this.mmap_read8(e):this.mem8[e]},CPU.prototype.read16=function(e){return this.debug_read(e,2),USE_A20&&!this.a20_enabled&&(e&=A20_MASK),this.in_mapped_range(e)?this.mmap_read16(e):this.mem8[e]|this.mem8[e+1|0]<<8},CPU.prototype.read_aligned16=function(e){return dbg_assert(0<=e&&2147483648>e),this.debug_read(e<<1,2),USE_A20&&!this.a20_enabled&&(e&=A20_MASK16),this.in_mapped_range(e<<1)?this.mmap_read16(e<<1):this.mem16[e]},CPU.prototype.read32s=function(e){return this.debug_read(e,4),USE_A20&&!this.a20_enabled&&(e&=A20_MASK),this.in_mapped_range(e)?this.mmap_read32(e):this.mem8[e]|this.mem8[e+1|0]<<8|this.mem8[e+2|0]<<16|this.mem8[e+3|0]<<24},CPU.prototype.read_aligned32=function(e){return dbg_assert(0<=e&&1073741824>e),this.debug_read(e<<2,4),USE_A20&&!this.a20_enabled&&(e&=A20_MASK32),this.in_mapped_range(e<<2)?this.mmap_read32(e<<2):this.mem32s[e]},CPU.prototype.write8=function(e,t){this.debug_write(e,1,t),USE_A20&&!this.a20_enabled&&(e&=A20_MASK),this.in_mapped_range(e)?this.mmap_write8(e,t):this.mem8[e]=t},CPU.prototype.write16=function(e,t){this.debug_write(e,2,t),USE_A20&&!this.a20_enabled&&(e&=A20_MASK),this.in_mapped_range(e)?this.mmap_write16(e,t):(this.mem8[e]=t,this.mem8[e+1|0]=t>>8)},CPU.prototype.write_aligned16=function(e,t){dbg_assert(0<=e&&2147483648>e),this.debug_write(e<<1,2,t),USE_A20&&!this.a20_enabled&&(e&=A20_MASK16),this.in_mapped_range(e<<1)?this.mmap_write16(e<<1,t):this.mem16[e]=t},CPU.prototype.write32=function(e,t){this.debug_write(e,4,t),USE_A20&&!this.a20_enabled&&(e&=A20_MASK),this.in_mapped_range(e)?this.mmap_write32(e,t):(this.mem8[e]=t,this.mem8[e+1|0]=t>>8,this.mem8[e+2|0]=t>>16,this.mem8[e+3|0]=t>>24)},CPU.prototype.write_aligned32=function(e,t){dbg_assert(0<=e&&1073741824>e),this.debug_write(e<<2,4,t),USE_A20&&!this.a20_enabled&&(e&=A20_MASK32),this.in_mapped_range(e<<2)?this.mmap_write32(e<<2,t):this.mem32s[e]=t},CPU.prototype.write_blob=function(e,t){this.debug_write(t,e.length,0),dbg_assert(e&&0<=e.length),this.mem8.set(e,t)},CPU.prototype.write_blob32=function(e,t){dbg_assert(e&&e.length),this.debug_write(t,e.length<<2,0),this.mem32s.set(e,t)},DMA.prototype.get_state=function(){return[this.channel_page,this.channel_pagehi,this.channel_addr,this.channel_addr_init,this.channel_count,this.channel_count_init,this.channel_mask,this.channel_mode,this.lsb_msb_flipflop]},DMA.prototype.set_state=function(e){this.channel_page=e[0],this.channel_pagehi=e[1],this.channel_addr=e[2],this.channel_addr_init=e[3],this.channel_count=e[4],this.channel_count_init=e[5],this.channel_mask=e[6],this.channel_mode=e[7],this.lsb_msb_flipflop=e[8]},DMA.prototype.port_count_write=function(e,t){dbg_log("count write ["+e+"] = "+h(t),LOG_DMA),this.channel_count[e]=this.flipflop_get(this.channel_count[e],t,!1),this.channel_count_init[e]=this.flipflop_get(this.channel_count_init[e],t,!0)},DMA.prototype.port_count_read=function(e){return dbg_log("count read ["+e+"] -> "+h(this.channel_count[e]),LOG_DMA),this.flipflop_read(this.channel_count[e])},DMA.prototype.port_addr_write=function(e,t){dbg_log("addr write ["+e+"] = "+h(t),LOG_DMA),this.channel_addr[e]=this.flipflop_get(this.channel_addr[e],t,!1),this.channel_addr_init[e]=this.flipflop_get(this.channel_addr_init[e],t,!0)},DMA.prototype.port_addr_read=function(e){return dbg_log("addr read ["+e+"] -> "+h(this.channel_addr[e]),LOG_DMA),this.flipflop_read(this.channel_addr[e])},DMA.prototype.port_pagehi_write=function(e,t){dbg_log("pagehi write ["+e+"] = "+h(t),LOG_DMA),this.channel_pagehi[e]=t},DMA.prototype.port_pagehi_read=function(e){return dbg_log("pagehi read ["+e+"]",LOG_DMA),this.channel_pagehi[e]},DMA.prototype.port_page_write=function(e,t){dbg_log("page write ["+e+"] = "+h(t),LOG_DMA),this.channel_page[e]=t},DMA.prototype.port_page_read=function(e){return dbg_log("page read ["+e+"]",LOG_DMA),this.channel_page[e]},DMA.prototype.port_singlemask_write=function(e,t){e=(3&t)+e,t=!!(4&t),dbg_log("singlechannel mask write ["+e+"] = "+t,LOG_DMA),this.update_mask(e,t)},DMA.prototype.port_multimask_write=function(e,t){dbg_log("multichannel mask write: "+h(t),LOG_DMA);for(var s=0;4>s;s++)this.update_mask(e+s,t&1<<s)},DMA.prototype.port_multimask_read=function(e){var t=0|this.channel_mask[e+0];return t|=this.channel_mask[e+1]<<1,t|=this.channel_mask[e+2]<<2,t|=this.channel_mask[e+3]<<3,dbg_log("multichannel mask read: "+h(t),LOG_DMA),t},DMA.prototype.port_mode_write=function(e,t){e=(3&t)+e,dbg_log("mode write ["+e+"] = "+h(t),LOG_DMA),this.channel_mode[e]=t},DMA.prototype.portC_write=function(e){dbg_log("flipflop reset",LOG_DMA),this.lsb_msb_flipflop=0},DMA.prototype.on_unmask=function(e,t){this.unmask_listeners.push({fn:e,this_value:t})},DMA.prototype.update_mask=function(e,t){if(this.channel_mask[e]!==t&&(this.channel_mask[e]^=1,!t))for(dbg_log("firing on_unmask("+e+")",LOG_DMA),t=0;t<this.unmask_listeners.length;t++)this.unmask_listeners[t].fn.call(this.unmask_listeners[t].this_value,e)},DMA.prototype.do_read=function(e,t,s,r,i){var _=this.count_get_8bit(r),a=this.address_get_8bit(r);if(dbg_log("DMA write channel "+r,LOG_DMA),dbg_log("to "+h(a)+" len "+h(_),LOG_DMA),s<_&&dbg_log("DMA should read more than provided: "+h(s)+" "+h(_),LOG_DMA),t+_>e.byteLength)dbg_log("DMA read outside of buffer",LOG_DMA),i(!0);else{var o=this.cpu
;this.channel_addr[r]+=_,e.get(t,_,function(e){o.write_blob(e,a),i(!1)})}},DMA.prototype.do_write=function(e,t,s,r,i){var _=this,a=this.channel_count[r]+1&65535,o=5<=r?2:1,n=a*o,d=this.address_get_8bit(r),g=!1,c=!1,p=16&this.channel_mode[r];dbg_log("DMA write channel "+r,LOG_DMA),dbg_log("to "+h(d)+" len "+h(n),LOG_DMA),s<n?(dbg_log("DMA should read more than provided",LOG_DMA),a=Math.floor(s/o),n=a*o,g=!0):s>n&&(dbg_log("DMA attempted to read more than provided",LOG_DMA),c=!0),t+n>e.byteLength?(dbg_log("DMA write outside of buffer",LOG_DMA),i(!0)):(this.channel_addr[r]+=a,this.channel_count[r]-=a,!g&&p&&(dbg_log("DMA autoinit",LOG_DMA),this.channel_addr[r]=this.channel_addr_init[r],this.channel_count[r]=this.channel_count_init[r]),e.set(t,this.cpu.mem8.subarray(d,d+n),function(){c&&p?(dbg_log("DMA continuing from start",LOG_DMA),_.do_write(e,t+n,s-n,r,i)):i(!1)}))},DMA.prototype.address_get_8bit=function(e){var t=this.channel_addr[e];return 5<=e&&(t<<=1),t=65535&t|this.channel_page[e]<<16,t|=this.channel_pagehi[e]<<24},DMA.prototype.count_get_8bit=function(e){var t=this.channel_count[e]+1;return 5<=e&&(t*=2),t},DMA.prototype.flipflop_get=function(e,t,s){return s||(this.lsb_msb_flipflop^=1),this.lsb_msb_flipflop?-256&e|t:-65281&e|t<<8},DMA.prototype.flipflop_read=function(e){return(this.lsb_msb_flipflop^=1)?255&e:e>>8&255};var OSCILLATOR_FREQ=1193.1816666;PIT.prototype.get_state=function(){var e=[];return e[0]=this.counter_next_low,e[1]=this.counter_enabled,e[2]=this.counter_mode,e[3]=this.counter_read_mode,e[4]=this.counter_latch,e[5]=this.counter_latch_value,e[6]=this.counter_reload,e[7]=this.counter_start_time,e[8]=this.counter_start_value,e},PIT.prototype.set_state=function(e){this.counter_next_low=e[0],this.counter_enabled=e[1],this.counter_mode=e[2],this.counter_read_mode=e[3],this.counter_latch=e[4],this.counter_latch_value=e[5],this.counter_reload=e[6],this.counter_start_time=e[7],this.counter_start_value=e[8]},PIT.prototype.timer=function(e,t){return t||(this.counter_enabled[0]&&this.did_rollover(0,e)?(this.counter_start_value[0]=this.get_counter_value(0,e),this.counter_start_time[0]=e,dbg_log("pit interrupt. new value: "+this.counter_start_value[0],LOG_PIT),this.cpu.device_raise_irq(0),0===this.counter_mode[0]&&(this.counter_enabled[0]=0)):this.cpu.device_lower_irq(0)),0},PIT.prototype.get_counter_value=function(e,t){if(!this.counter_enabled[e])return 0;var s=t-this.counter_start_time[e],r=Math.floor(s*OSCILLATOR_FREQ);return t=this.counter_start_value[e]-r,dbg_log("diff="+s+" dticks="+r+" value="+t+" reload="+this.counter_reload[e],LOG_PIT),s=this.counter_reload[e],t>=s?(dbg_log("Warning: Counter"+e+" value "+t+" is larger than reload "+s,LOG_PIT),t%=s):0>t&&(t=t%s+s),t},PIT.prototype.did_rollover=function(e,t){return t-=this.counter_start_time[e],0>t?(dbg_log("Warning: PIT timer difference is negative, resetting"),!0):this.counter_start_value[e]<Math.floor(t*OSCILLATOR_FREQ)},PIT.prototype.counter_read=function(e){var t=this.counter_latch[e];return t?(this.counter_latch[e]--,2===t?255&this.counter_latch_value[e]:this.counter_latch_value[e]>>8):(t=this.counter_next_low[e],3===this.counter_mode[e]&&(this.counter_next_low[e]^=1),e=this.get_counter_value(e,v86.microtick()),t?255&e:e>>8)},PIT.prototype.counter_write=function(e,t){this.counter_reload[e]=this.counter_next_low[e]?-256&this.counter_reload[e]|t:255&this.counter_reload[e]|t<<8,3===this.counter_read_mode[e]&&this.counter_next_low[e]||(this.counter_reload[e]||(this.counter_reload[e]=65535),this.counter_start_value[e]=this.counter_reload[e],this.counter_enabled[e]=!0,this.counter_start_time[e]=v86.microtick(),dbg_log("counter"+e+" reload="+h(this.counter_reload[e])+" tick="+(this.counter_reload[e]||65536)/OSCILLATOR_FREQ+"ms",LOG_PIT)),3===this.counter_read_mode[e]&&(this.counter_next_low[e]^=1),this.bus.send("pcspeaker-update",[this.counter_mode[2],this.counter_reload[2]])},PIT.prototype.port43_write=function(e){var t=e>>1&7,s=1&e,r=e>>6&3;e=e>>4&3,1===r&&dbg_log("Unimplemented timer1",LOG_PIT),3===r?dbg_log("Unimplemented read back",LOG_PIT):0===e?(this.counter_latch[r]=2,t=this.get_counter_value(r,v86.microtick()),dbg_log("latch: "+t,LOG_PIT),this.counter_latch_value[r]=t?t-1:0):(6<=t&&(t&=-5),dbg_log("Control: mode="+t+" ctr="+r+" read_mode="+e+" bcd="+s,LOG_PIT),this.counter_next_low[r]=1===e?0:1,0===r&&this.cpu.device_lower_irq(0),0!==t&&3!==t&&2!==t&&dbg_log("Unimplemented counter mode: "+h(t),LOG_PIT),this.counter_mode[r]=t,this.counter_read_mode[r]=e,this.bus.send("pcspeaker-update",[this.counter_mode[2],this.counter_reload[2]]))};var VGA_BANK_SIZE=65536,MAX_XRES=2560,MAX_YRES=1600,VGA_LFB_ADDRESS=3758096384,VGA_PLANAR_REAL_BUFFER_START=4*VGA_BANK_SIZE;VGAScreen.prototype.get_state=function(){var e=[];return e[0]=this.vga_memory_size,e[1]=this.cursor_address,e[2]=this.cursor_scanline_start,e[3]=this.cursor_scanline_end,e[4]=this.max_cols,e[5]=this.max_rows,e[6]=this.screen_width,e[7]=this.screen_height,e[8]=this.start_address,e[9]=this.graphical_mode,e[10]=this.vga256_palette,e[11]=this.latch0,e[12]=this.latch1,e[13]=this.latch2,e[14]=this.latch3,e[15]=this.svga_width,e[16]=this.svga_height,e[17]=this.text_mode_width,e[18]=this.svga_enabled,e[19]=this.svga_bpp,e[20]=this.svga_bank_offset,e[21]=this.svga_offset,e[22]=this.index_crtc,e[23]=this.dac_color_index_write,e[24]=this.dac_color_index_read,e[25]=this.dac_map,e[26]=this.sequencer_index,e[27]=this.plane_write_bm,e[28]=this.sequencer_memory_mode,e[29]=this.graphics_index,e[30]=this.plane_read,e[31]=this.planar_mode,e[32]=this.planar_rotate_reg,e[33]=this.planar_bitmap,e[34]=this.max_scan_line,e[35]=this.miscellaneous_output_register,e[36]=this.port_3DA_value,e[37]=this.dispi_index,e[38]=this.dispi_enable_value,e[39]=this.svga_memory,e[40]=this.graphical_mode_is_linear,e[41]=this.attribute_controller_index,e[42]=this.offset_register,e},VGAScreen.prototype.set_state=function(e){this.vga_memory_size=e[0],this.cursor_address=e[1],this.cursor_scanline_start=e[2],this.cursor_scanline_end=e[3],this.max_cols=e[4],this.max_rows=e[5],this.screen_width=e[6],this.screen_height=e[7],this.start_address=e[8],this.graphical_mode=e[9],this.vga256_palette=e[10],this.latch0=e[11],this.latch1=e[12],this.latch2=e[13],this.latch3=e[14],this.svga_width=e[15],this.svga_height=e[16],this.text_mode_width=e[17],this.svga_enabled=e[18],this.svga_bpp=e[19],this.svga_bank_offset=e[20],this.svga_offset=e[21],this.index_crtc=e[22],this.dac_color_index_write=e[23],this.dac_color_index_read=e[24],this.dac_map=e[25],this.sequencer_index=e[26],this.plane_write_bm=e[27],this.sequencer_memory_mode=e[28],this.graphics_index=e[29],this.plane_read=e[30],this.planar_mode=e[31],this.planar_rotate_reg=e[32],this.planar_bitmap=e[33],this.max_scan_line=e[34],this.miscellaneous_output_register=e[35],this.port_3DA_value=e[36],this.dispi_index=e[37],this.dispi_enable_value=e[38],this.svga_memory.set(e[39]),this.graphical_mode_is_linear=e[40],this.attribute_controller_index=e[41],this.offset_register=e[42],this.bus.send("screen-set-mode",this.graphical_mode),this.graphical_mode?this.set_size_graphical(this.svga_width,this.svga_height,this.svga_bpp):(this.set_size_text(this.max_cols,this.max_rows),this.update_cursor_scanline(),this.update_cursor()),this.complete_redraw()},VGAScreen.prototype.vga_memory_read=function(e){return e-=655360,!this.graphical_mode||this.graphical_mode_is_linear?(e|=this.svga_bank_offset,this.svga_memory[e]):(e&=65535,this.latch0=this.plane0[e],this.latch1=this.plane1[e],this.latch2=this.plane2[e],this.latch3=this.plane3[e],this.vga_memory[this.plane_read<<16|e])},VGAScreen.prototype.vga_memory_write=function(e,t){e-=655360,this.graphical_mode?this.graphical_mode_is_linear?this.vga_memory_write_graphical_linear(e,t):this.vga_memory_write_graphical_planar(e,t):this.vga_memory_write_text_mode(e,t)},VGAScreen.prototype.vga_memory_write_graphical_linear=function(e,t){e|=this.svga_bank_offset,this.diff_addr_min=e<this.diff_addr_min?e:this.diff_addr_min,this.diff_addr_max=e>this.diff_addr_max?e:this.diff_addr_max,this.svga_memory[e]=t},VGAScreen.prototype.vga_memory_write_graphical_planar=function(e,t){if(!(65535<e)){var s,r,i,_=3&this.planar_mode;if(dbg_assert(0==(7&this.planar_rotate_reg),"unimplemented"),dbg_assert(3!==_,"unimplemented"),dbg_assert(0==(112&this.planar_mode),"unimplemented"),0===_)var a=s=r=i=t;else 2===_&&(1&this.plane_write_bm&&(a=this.latch0&~this.planar_bitmap|(1&t?255:0)&this.planar_bitmap),2&this.plane_write_bm&&(s=this.latch1&~this.planar_bitmap|(2&t?255:0)&this.planar_bitmap),4&this.plane_write_bm&&(r=this.latch2&~this.planar_bitmap|(4&t?255:0)&this.planar_bitmap),8&this.plane_write_bm&&(i=this.latch3&~this.planar_bitmap|(8&t?255:0)&this.planar_bitmap));if(0===_||2===_){switch(24&this.planar_rotate_reg){case 8:a&=this.latch0,s&=this.latch1,r&=this.latch2,i&=this.latch3;break;case 16:a|=this.latch0,s|=this.latch1,r|=this.latch2,i|=this.latch3;break;case 24:a^=this.latch0,s^=this.latch1,r^=this.latch2,i^=this.latch3}1&this.plane_write_bm&&(a=this.latch0&~this.planar_bitmap|a&this.planar_bitmap),2&this.plane_write_bm&&(s=this.latch1&~this.planar_bitmap|s&this.planar_bitmap),4&this.plane_write_bm&&(r=this.latch2&~this.planar_bitmap|r&this.planar_bitmap),8&this.plane_write_bm&&(i=this.latch3&~this.planar_bitmap|i&this.planar_bitmap)}else 1===_&&(a=this.latch0,s=this.latch1,r=this.latch2,i=this.latch3);if(1&this.plane_write_bm?this.plane0[e]=a:a=this.plane0[e],2&this.plane_write_bm?this.plane1[e]=s:s=this.plane1[e],4&this.plane_write_bm?this.plane2[e]=r:r=this.plane2[e],8&this.plane_write_bm?this.plane3[e]=i:i=this.plane3[e],!(e>=this.screen_width*this.screen_height<<3))for(s<<=1,r<<=2,i<<=3,e=e<<3|7,t=e+VGA_PLANAR_REAL_BUFFER_START,this.diff_addr_min=t-7<this.diff_addr_min?t-7:this.diff_addr_min,this.diff_addr_max=t>this.diff_addr_max?t:this.diff_addr_max,t=0;8>t;t++)this.svga_memory[e+VGA_PLANAR_REAL_BUFFER_START]=this.dac_map[a>>t&1|s>>t&2|r>>t&4|i>>t&8],e--}},VGAScreen.prototype.text_mode_redraw=function(){for(var e=98304|this.start_address<<1,t,s,r=0;r<this.max_rows;r++)for(var i=0;i<this.max_cols;i++)t=this.vga_memory[e],s=this.vga_memory[1|e],this.bus.send("screen-put-char",[r,i,t,this.vga256_palette[s>>4&15],this.vga256_palette[15&s]]),e+=2},VGAScreen.prototype.vga_memory_write_text_mode=function(e,t){if(!(98304>e)){var s=(e-98304>>1)-this.start_address,r=s/this.max_cols|0;if(s%=this.max_cols,1&e)var i=t,_=this.vga_memory[-2&e];else _=t,i=this.vga_memory[1|e];this.bus.send("screen-put-char",[r,s,_,this.vga256_palette[i>>4&15],this.vga256_palette[15&i]]),this.vga_memory[e]=t}},VGAScreen.prototype.update_cursor=function(){var e=(this.cursor_address-this.start_address)/this.max_cols|0,t=(this.cursor_address-this.start_address)%this.max_cols;e=Math.min(this.max_rows-1,e),this.bus.send("screen-update-cursor",[e,t])},VGAScreen.prototype.svga_memory_read8=function(e){return this.svga_memory[268435455&e]},VGAScreen.prototype.svga_memory_read32=function(e){return e&=268435455,3&e?this.svga_memory[e]|this.svga_memory[e+1]<<8|this.svga_memory[e+2]<<16|this.svga_memory[e+3]<<24:this.svga_memory32[e>>2]},VGAScreen.prototype.svga_memory_write8=function(e,t){e&=268435455,this.svga_memory[e]=t,this.diff_addr_min=e<this.diff_addr_min?e:this.diff_addr_min,this.diff_addr_max=e>this.diff_addr_max?e:this.diff_addr_max},VGAScreen.prototype.svga_memory_write32=function(e,t){e&=268435455,this.diff_addr_min=e<this.diff_addr_min?e:this.diff_addr_min,this.diff_addr_max=e+3>this.diff_addr_max?e+3:this.diff_addr_max,this.svga_memory[e]=t,this.svga_memory[e+1]=t>>8,this.svga_memory[e+2]=t>>16,this.svga_memory[e+3]=t>>24},VGAScreen.prototype.complete_redraw=function(){dbg_log("complete redraw",LOG_VGA),this.graphical_mode?(this.diff_addr_min=0,this.diff_addr_max=this.vga_memory_size):this.text_mode_redraw()},VGAScreen.prototype.destroy=function(){},VGAScreen.prototype.set_size_text=function(e,t){this.max_cols=e,this.max_rows=t,this.bus.send("screen-set-size-text",[e,t])},VGAScreen.prototype.set_size_graphical=function(e,t,s){this.screen_width=e,this.screen_height=t,this.stats.bpp=s,this.stats.is_graphical=!0,this.stats.res_x=e,this.stats.res_y=t,this.bus.send("screen-set-size-graphical",[e,t,s])},VGAScreen.prototype.update_cursor_scanline=function(){this.bus.send("screen-update-cursor-scanline",[this.cursor_scanline_start,this.cursor_scanline_end])},VGAScreen.prototype.set_video_mode=function(e){var t=!1,s=0,r=0;switch(e){case 102:this.set_size_text(110,46);break;case 3:this.set_size_text(this.text_mode_width,25);break;case 16:s=640,r=350,t=!0,this.graphical_mode_is_linear=!1;break;case 18:s=640,r=480,t=!0,this.graphical_mode_is_linear=!1;break;case 19:s=320,r=200,this.graphical_mode_is_linear=t=!0}this.bus.send("screen-set-mode",t),(this.stats.is_graphical=t)&&(this.svga_width=s,this.svga_height=r,this.set_size_graphical(s,r,8)),this.graphical_mode=t,dbg_log("Current video mode: "+h(e),LOG_VGA)},VGAScreen.prototype.port3C0_write=function(e){-1===this.attribute_controller_index?this.attribute_controller_index=e:(16>this.attribute_controller_index?this.dac_map[this.attribute_controller_index]=e:dbg_log("3C0 / attribute controller write "+h(this.attribute_controller_index)+": "+h(e),LOG_VGA),this.attribute_controller_index=-1)},VGAScreen.prototype.port3C0_read=function(){dbg_log("3C0 read",LOG_VGA);var e=this.attribute_controller_index;return this.attribute_controller_index=-1,e},VGAScreen.prototype.port3C0_read16=function(){return dbg_log("3C0 read16",LOG_VGA),255&this.port3C0_read()|this.port3C1_read()<<8&65280},VGAScreen.prototype.port3C1_read=function(){return this.attribute_controller_index=-1,dbg_log("3C1 / attribute controller read "+h(this.attribute_controller_index),LOG_VGA),-1},VGAScreen.prototype.port3C2_write=function(e){dbg_log("3C2 / miscellaneous output register = "+h(e),LOG_VGA),this.miscellaneous_output_register=e,this.switch_video_mode(e)},VGAScreen.prototype.port3C4_write=function(e){this.sequencer_index=e},VGAScreen.prototype.port3C4_read=function(){return this.sequencer_index},VGAScreen.prototype.port3C5_write=function(e){switch(this.sequencer_index){case 2:this.plane_write_bm=e;break;case 4:dbg_log("sequencer memory mode: "+h(e),LOG_VGA),this.sequencer_memory_mode=e;break;default:dbg_log("3C5 / sequencer write "+h(this.sequencer_index)+": "+h(e),LOG_VGA)}},VGAScreen.prototype.port3C5_read=function(){switch(dbg_log("3C5 / sequencer read "+h(this.sequencer_index),LOG_VGA),this.sequencer_index){case 2:return this.plane_write_bm;case 4:return this.sequencer_memory_mode;case 6:return 18}return 0},VGAScreen.prototype.port3C7_write=function(e){dbg_log("3C7 write: "+h(e),LOG_VGA),this.dac_color_index_read=3*e},VGAScreen.prototype.port3C8_write=function(e){this.dac_color_index_write=3*e},VGAScreen.prototype.port3C9_write=function(e){var t=this.dac_color_index_write/3|0,s=this.dac_color_index_write%3,r=this.vga256_palette[t];e=255*e/63&255,0===s?r=-16711681&r|e<<16:1===s?r=-65281&r|e<<8:(r=-256&r|e,dbg_log("dac set color, index="+h(t)+" value="+h(r),LOG_VGA)),this.vga256_palette[t]=r,this.dac_color_index_write++},VGAScreen.prototype.port3C9_read=function(){dbg_log("3C9 read",LOG_VGA);var e=this.dac_color_index_read%3,t=this.vga256_palette[this.dac_color_index_read/3|0];return this.dac_color_index_read++,(t>>8*(2-e)&255)/255*63|0},VGAScreen.prototype.port3CC_read=function(){return dbg_log("3CC read",LOG_VGA),this.miscellaneous_output_register},VGAScreen.prototype.port3CE_write=function(e){this.graphics_index=e},VGAScreen.prototype.port3CE_read=function(){return this.graphics_index},VGAScreen.prototype.port3CF_write=function(e){switch(this.graphics_index){case 3:this.planar_rotate_reg=e,dbg_log("plane rotate: "+h(e),LOG_VGA);break;case 4:this.plane_read=e,dbg_log("plane read: "+h(e),LOG_VGA);break;case 5:this.planar_mode=e,dbg_log("planar mode: "+h(e),LOG_VGA);break;case 8:this.planar_bitmap=e,dbg_log("planar bitmap: "+h(e),LOG_VGA);break;default:dbg_log("3CF / graphics write "+h(this.graphics_index)+": "+h(e),LOG_VGA)}},VGAScreen.prototype.port3CF_read=function(){switch(dbg_log("3CF / graphics read "+h(this.graphics_index),LOG_VGA),this.graphics_index){case 3:return this.planar_rotate_reg;case 4:return this.plane_read;case 5:return this.planar_mode;case 8:return this.planar_bitmap}return 0},VGAScreen.prototype.port3D4_write=function(e){this.index_crtc=e},VGAScreen.prototype.port3D5_write=function(e){switch(this.index_crtc){case 2:this.text_mode_width=e;break;case 9:this.max_scan_line=e,7==(31&e)?this.set_size_text(this.text_mode_width,50):this.set_size_text(this.text_mode_width,25);break;case 10:this.cursor_scanline_start=e,this.update_cursor_scanline();break;case 11:this.cursor_scanline_end=e,this.update_cursor_scanline();break;case 12:this.previous_start_address=this.start_address,this.start_address=255&this.start_address|e<<8,this.complete_redraw();break;case 13:this.start_address=65280&this.start_address|e,this.start_address-this.previous_start_address&&this.complete_redraw(),dbg_log("start addr: "+h(this.start_address,4),LOG_VGA);break;case 14:this.cursor_address=255&this.cursor_address|e<<8,this.update_cursor();break;case 15:this.cursor_address=65280&this.cursor_address|e,this.update_cursor();break;case 19:this.offset_register=e;break;default:this.index_crtc<this.crtc.length&&(this.crtc[this.index_crtc]=e),dbg_log("3D5 / CRTC write "+h(this.index_crtc)+": "+h(e),LOG_VGA)}},VGAScreen.prototype.port3D5_read=function(){switch(dbg_log("3D5 read "+h(this.index_crtc),LOG_VGA),this.index_crtc){case 9:return this.max_scan_line;case 10:return this.cursor_scanline_start;case 11:return this.cursor_scanline_end;case 12:return 255&this.start_address;case 13:return this.start_address>>8;case 14:return this.cursor_address>>8;case 15:return 255&this.cursor_address;case 1:return 80;case 18:return 50;case 19:return this.offset_register}return this.index_crtc<this.crtc.length?this.crtc[this.index_crtc]:0},VGAScreen.prototype.port3DA_read=function(){return dbg_log("3DA read",LOG_VGA),this.port_3DA_value^=8,this.attribute_controller_index=-1,this.port_3DA_value},VGAScreen.prototype.switch_video_mode=function(e){102===e?this.set_video_mode(102):103===e?this.set_video_mode(3):227===e?this.set_video_mode(18):99===e?this.set_video_mode(19):163===e?this.set_video_mode(16):(dbg_log("Unkown MAR value: "+h(e,2)+", going back to text mode",LOG_VGA),this.set_video_mode(3))},VGAScreen.prototype.svga_bytes_per_line=function(){return this.svga_width*(15===this.svga_bpp?16:this.svga_bpp)/8},VGAScreen.prototype.port1CE_write=function(e){this.dispi_index=e},VGAScreen.prototype.port1CF_write=function(e){switch(dbg_log("1CF / dispi write "+h(this.dispi_index)+": "+h(e),LOG_VGA),this.dispi_index){case 1:this.svga_width=e,this.svga_width>MAX_XRES&&(dbg_log("svga_width reduced from "+this.svga_width+" to "+MAX_XRES,LOG_VGA),this.svga_width=MAX_XRES);break;case 2:this.svga_height=e,this.svga_height>MAX_YRES&&(dbg_log("svga_height reduced from "+this.svga_height+" to "+MAX_YRES,LOG_VGA),this.svga_height=MAX_YRES);break;case 3:this.svga_bpp=e;break;case 4:this.svga_enabled=1==(1&e),this.dispi_enable_value=e;break;case 5:this.svga_bank_offset=e<<16;break;case 9:this.svga_offset=e*this.svga_bytes_per_line(),dbg_log("SVGA offset: "+h(this.svga_offset)+" y="+h(e),LOG_VGA),this.complete_redraw()}!this.svga_enabled||this.svga_width&&this.svga_height||(dbg_log("SVGA: disabled because of invalid width/height: "+this.svga_width+"x"+this.svga_height,LOG_VGA),this.svga_enabled=!1),dbg_assert(4!==this.svga_bpp,"unimplemented svga bpp: 4"),dbg_assert(15!==this.svga_bpp,"unimplemented svga bpp: 15"),dbg_assert(4===this.svga_bpp||8===this.svga_bpp||15===this.svga_bpp||16===this.svga_bpp||24===this.svga_bpp||32===this.svga_bpp,"unexpected svga bpp: "+this.svga_bpp),dbg_log("SVGA: enabled="+this.svga_enabled+", "+this.svga_width+"x"+this.svga_height+"x"+this.svga_bpp,LOG_VGA),this.svga_enabled&&4===this.dispi_index&&(this.set_size_graphical(this.svga_width,this.svga_height,this.svga_bpp),this.bus.send("screen-set-mode",!0),this.graphical_mode_is_linear=this.graphical_mode=!0),this.svga_enabled||(this.svga_bank_offset=0)},VGAScreen.prototype.port1CF_read=function(){return dbg_log("1CF / dispi read "+h(this.dispi_index),LOG_VGA),this.svga_register_read(this.dispi_index)},VGAScreen.prototype.svga_register_read=function(e){switch(e){case 0:return 45248;case 1:return 2&this.dispi_enable_value?MAX_XRES:this.svga_width;case 2:return 2&this.dispi_enable_value?MAX_YRES:this.svga_height;case 3:return 2&this.dispi_enable_value?32:this.svga_bpp;case 4:return this.dispi_enable_value;case 5:return this.svga_bank_offset>>>16;case 6:return this.screen_width?this.screen_width:1;case 8:return 0;case 10:return this.vga_memory_size/VGA_BANK_SIZE|0}return 255},VGAScreen.prototype.screen_fill_buffer=function(){if(this.graphical_mode)if(this.dest_buffer){if(!(this.diff_addr_max<this.diff_addr_min)){var e=0;if(this.svga_enabled)var t=this.svga_bpp;else this.graphical_mode_is_linear?t=8:(t=8,e=VGA_PLANAR_REAL_BUFFER_START);var s=this.dest_buffer,r=this.diff_addr_min,i=this.diff_addr_max;switch(t){case 32:var _=r>>2,a=1+(i>>2);for(t=_;t<a;t++)i=this.svga_memory32[t],s[t]=i<<16|i>>16&255|65280&i|4278190080;break;case 24:_=r/3|0,a=1+(i/3|0);var o=3*_;for(t=_;o<i;t++){var n=this.svga_memory[o++];e=this.svga_memory[o++],r=this.svga_memory[o++],s[t]=n<<16|e<<8|r|4278190080}break;case 16:for(_=r>>1,a=1+(i>>1),t=_;t<a;t++)i=this.svga_memory16[t],r=255*(i>>11)/31|0,e=255*(i>>5&63)/63|0,n=255*(31&i)/31|0,s[t]=n<<16|e<<8|r|4278190080;break;case 8:for(_=r-e,a=i-e+1,t=r;t<i;t++)r=this.vga256_palette[this.svga_memory[t]],s[t-e]=65280&r|r<<16|r>>16|4278190080;break;default:dbg_assert(!1,"Unsupported BPP: "+t)}this.diff_addr_min=this.vga_memory_size,this.diff_addr_max=0,this.bus.send("screen-fill-buffer-end",[_,a])}}else dbg_log("Cannot fill buffer: No destination buffer",LOG_VGA)},PS2.prototype.get_state=function(){var e=[];return e[0]=this.enable_mouse_stream,e[1]=this.use_mouse,e[2]=this.have_mouse,e[3]=this.mouse_delta_x,e[4]=this.mouse_delta_y,e[5]=this.mouse_clicks,e[6]=this.have_keyboard,e[7]=this.enable_keyboard_stream,e[8]=this.next_is_mouse_command,e[9]=this.next_read_sample,e[10]=this.next_read_led,e[11]=this.next_handle_scan_code_set,e[12]=this.next_read_rate,e[13]=this.next_read_resolution,e[15]=this.last_port60_byte,e[16]=this.sample_rate,e[17]=this.resolution,e[18]=this.scaling2,e[20]=this.command_register,e[21]=this.read_output_register,e[22]=this.read_command_register,e},PS2.prototype.set_state=function(e){this.enable_mouse_stream=e[0],this.use_mouse=e[1],this.have_mouse=e[2],this.mouse_delta_x=e[3],this.mouse_delta_y=e[4],this.mouse_clicks=e[5],this.have_keyboard=e[6],this.enable_keyboard_stream=e[7],this.next_is_mouse_command=e[8],this.next_read_sample=e[9],this.next_read_led=e[10],this.next_handle_scan_code_set=e[11],this.next_read_rate=e[12],this.next_read_resolution=e[13],this.last_port60_byte=e[15],this.sample_rate=e[16],this.resolution=e[17],this.scaling2=e[18],this.command_register=e[20],this.read_output_register=e[21],this.read_command_register=e[22],this.bus.send("mouse-enable",this.use_mouse)},PS2.prototype.mouse_irq=function(){2&this.command_register&&this.cpu.device_raise_irq(12)},PS2.prototype.kbd_irq=function(){1&this.command_register&&this.cpu.device_raise_irq(1)},PS2.prototype.kbd_send_code=function(e){this.enable_keyboard_stream&&(this.kbd_buffer.push(e),this.kbd_irq())},PS2.prototype.mouse_send_delta=function(e,t){if(this.have_mouse&&this.use_mouse){var s=this.resolution*this.sample_rate/80;this.mouse_delta_x+=e*s,this.mouse_delta_y+=t*s,this.enable_mouse_stream&&(e=0|this.mouse_delta_x,t=0|this.mouse_delta_y,e||t)&&(Date.now(),this.mouse_delta_x-=e,this.mouse_delta_y-=t,this.send_mouse_packet(e,t))}},PS2.prototype.mouse_send_click=function(e,t,s){this.have_mouse&&this.use_mouse&&(this.mouse_clicks=e|s<<1|t<<2,this.enable_mouse_stream&&this.send_mouse_packet(0,0))},PS2.prototype.send_mouse_packet=function(e,t){var s=(0>t)<<5|(0>e)<<4|8|this.mouse_clicks;this.last_mouse_packet=Date.now(),this.mouse_buffer.push(s),this.mouse_buffer.push(e),this.mouse_buffer.push(t),dbg_log("adding mouse packets: "+[s,e,t],LOG_PS2),this.mouse_irq()},PS2.prototype.apply_scaling2=function(e){var t=e>>31;switch(Math.abs(e)){case 0:case 1:case 3:return e;case 2:return t;case 4:return 6*t;case 5:return 9*t;default:return e<<1}},PS2.prototype.next_byte_is_aux=function(){return this.mouse_buffer.length&&!this.kbd_buffer.length},PS2.prototype.port60_read=function(){return this.kbd_buffer.length||this.mouse_buffer.length?(this.next_byte_is_aux()?(this.cpu.device_lower_irq(12),this.last_port60_byte=this.mouse_buffer.shift(),dbg_log("Port 60 read (mouse): "+h(this.last_port60_byte),LOG_PS2),1<=this.mouse_buffer.length&&this.mouse_irq()):(this.cpu.device_lower_irq(1),this.last_port60_byte=this.kbd_buffer.shift(),dbg_log("Port 60 read (kbd) : "+h(this.last_port60_byte),LOG_PS2),1<=this.kbd_buffer.length&&this.kbd_irq()),this.last_port60_byte):(dbg_log("Port 60 read: Empty",LOG_PS2),this.last_port60_byte)},PS2.prototype.port64_read=function(){var e=16;return(this.mouse_buffer.length||this.kbd_buffer.length)&&(e|=1),this.next_byte_is_aux()&&(e|=32),dbg_log("port 64 read: "+h(e),LOG_PS2),e},PS2.prototype.port60_write=function(e){if(dbg_log("port 60 write: "+h(e),LOG_PS2),this.read_command_register)this.command_register=e,this.read_command_register=!1,dbg_log("Keyboard command register = "+h(this.command_register),LOG_PS2);else if(this.read_output_register)this.read_output_register=!1,this.mouse_buffer.clear(),this.mouse_buffer.push(e),this.mouse_irq();else if(this.next_read_sample)this.next_read_sample=!1,this.mouse_buffer.clear(),this.mouse_buffer.push(250),this.sample_rate=e,dbg_log("mouse sample rate: "+h(e),LOG_PS2),this.sample_rate||(dbg_log("invalid sample rate, reset to 100",LOG_PS2),this.sample_rate=100),this.mouse_irq();else if(this.next_read_resolution)this.next_read_resolution=!1,this.mouse_buffer.clear(),this.mouse_buffer.push(250),3<e?(this.resolution=4,dbg_log("invalid resolution, resetting to 4",LOG_PS2)):(this.resolution=1<<e,dbg_log("resolution: "+this.resolution,LOG_PS2)),this.mouse_irq();else if(this.next_read_led)this.next_read_led=!1,this.kbd_buffer.push(250),this.kbd_irq();else if(this.next_handle_scan_code_set)this.next_handle_scan_code_set=!1,this.kbd_buffer.push(250),this.kbd_irq(),e||this.kbd_buffer.push(2);else if(this.next_read_rate)this.next_read_rate=!1,this.kbd_buffer.push(250),this.kbd_irq();else if(this.next_is_mouse_command){if(this.next_is_mouse_command=!1,dbg_log("Port 60 data register write: "+h(e),LOG_PS2),this.have_mouse){switch(this.kbd_buffer.clear(),this.mouse_buffer.clear(),this.mouse_buffer.push(250),e){case 230:dbg_log("Scaling 1:1",LOG_PS2),this.scaling2=!1;break;case 231:dbg_log("Scaling 2:1",LOG_PS2),this.scaling2=!0;break;case 232:this.next_read_resolution=!0;break;case 233:this.send_mouse_packet(0,0);break;case 235:dbg_log("unimplemented request single packet",LOG_PS2),this.send_mouse_packet(0,0);break;case 242:this.mouse_buffer.push(0),this.mouse_buffer.push(0),this.mouse_clicks=this.mouse_delta_x=this.mouse_delta_y=0;break;case 243:this.next_read_sample=!0;break;case 244:this.use_mouse=this.enable_mouse_stream=!0,this.bus.send("mouse-enable",!0),this.mouse_clicks=this.mouse_delta_x=this.mouse_delta_y=0;break;case 245:this.enable_mouse_stream=!1;break;case 246:this.enable_mouse_stream=!1,this.sample_rate=100,this.scaling2=!1,this.resolution=4;break;case 255:dbg_log("Mouse reset",LOG_PS2),this.mouse_buffer.push(170),this.mouse_buffer.push(0),this.use_mouse=!0,this.bus.send("mouse-enable",!0),this.enable_mouse_stream=!1,this.sample_rate=100,this.scaling2=!1,this.resolution=4,this.mouse_clicks=this.mouse_delta_x=this.mouse_delta_y=0;break;default:dbg_log("Unimplemented mouse command: "+h(e),LOG_PS2)}this.mouse_irq()}}else{switch(dbg_log("Port 60 data register write: "+h(e),LOG_PS2),this.mouse_buffer.clear(),this.kbd_buffer.clear(),this.kbd_buffer.push(250),e){case 237:this.next_read_led=!0;break;case 240:this.next_handle_scan_code_set=!0;break;case 242:this.kbd_buffer.push(171),this.kbd_buffer.push(83);break;case 243:this.next_read_rate=!0;break;case 244:dbg_log("kbd enable scanning",LOG_PS2),this.enable_keyboard_stream=!0;break;case 245:dbg_log("kbd disable scanning",LOG_PS2),this.enable_keyboard_stream=!1;break;case 246:break;case 255:this.kbd_buffer.clear(),this.kbd_buffer.push(250),this.kbd_buffer.push(170),this.kbd_buffer.push(0);break;default:dbg_log("Unimplemented keyboard command: "+h(e),LOG_PS2)}this.kbd_irq()}},PS2.prototype.port64_write=function(e){switch(dbg_log("port 64 write: "+h(e),LOG_PS2),e){case 32:this.kbd_buffer.clear(),this.mouse_buffer.clear(),this.kbd_buffer.push(this.command_register);break;case 96:this.read_command_register=!0;break;case 211:this.read_output_register=!0;break;case 212:this.next_is_mouse_command=!0;break;case 167:dbg_log("Disable second port",LOG_PS2),this.command_register|=32;break;case 168:dbg_log("Enable second port",LOG_PS2),this.command_register&=-33;break;case 169:this.kbd_buffer.clear(),this.mouse_buffer.clear(),this.kbd_buffer.push(0);break;case 170:this.kbd_buffer.clear(),this.mouse_buffer.clear(),this.kbd_buffer.push(85);break;case 171:this.kbd_buffer.clear(),this.mouse_buffer.clear(),this.kbd_buffer.push(0);break;case 173:dbg_log("Disable Keyboard",LOG_PS2),this.command_register|=16;break;case 174:dbg_log("Enable Keyboard",LOG_PS2),this.command_register&=-17;break;case 254:dbg_log("CPU reboot via PS2"),this.cpu.reboot_internal();break;default:dbg_log("port 64: Unimplemented command byte: "+h(e),LOG_PS2)}};var PIC_LOG_VERBOSE=!1;PIC.prototype.get_state=function(){var e=[];return e[0]=this.irq_mask,e[1]=this.irq_map,e[2]=this.isr,e[3]=this.irr,e[4]=this.is_master,e[5]=this.slave,e[6]=this.expect_icw4,e[7]=this.state,e[8]=this.read_isr,e[9]=this.auto_eoi,e[10]=this.elcr,e},PIC.prototype.set_state=function(e){this.irq_mask=e[0],this.irq_map=e[1],this.isr=e[2],this.irr=e[3],this.is_master=e[4],this.slave=e[5],this.expect_icw4=e[6],this.state=e[7],this.read_isr=e[8],this.auto_eoi=e[9],this.elcr=e[10]},PIC.prototype.port20_write=function(e){if(16&e)dbg_log("icw1 = "+h(e),LOG_PIC),this.irq_value=this.irq_mask=this.irr=this.isr=0,this.auto_eoi=1,this.requested_irq=-1,this.expect_icw4=1&e,this.state=1;else if(8&e)dbg_log("ocw3: "+h(e),LOG_PIC),2&e&&(this.read_isr=1&e),4&e&&dbg_assert(!1,"unimplemented: polling",LOG_PIC),64&e&&(this.special_mask_mode=32==(32&e),dbg_log("special mask mode: "+this.special_mask_mode,LOG_PIC));else{dbg_log("eoi: "+h(e)+" ("+this.name+")",LOG_PIC);var t=e>>5;1===t?(this.isr&=this.isr-1,dbg_log("new isr: "+h(this.isr,2),LOG_PIC)):3===t?this.isr&=~(1<<(7&e)):192==(200&e)?dbg_log("lowest priority: "+h(7&e),LOG_PIC):(dbg_log("Unknown eoi: "+h(e),LOG_PIC),dbg_assert(!1),this.isr&=this.isr-1),this.check_irqs()}},PIC.prototype.port20_read=function(){return this.read_isr?(dbg_log("read port 20h (isr): "+h(this.isr),LOG_PIC),this.isr):(dbg_log("read port 20h (irr): "+h(this.irr),LOG_PIC),this.irr)},PIC.prototype.port21_write=function(e){0===this.state?this.expect_icw4?(this.expect_icw4=!1,this.auto_eoi=2&e,dbg_log("icw4: "+h(e)+" autoeoi="+this.auto_eoi,LOG_PIC),0==(1&e)&&dbg_assert(!1,"unimplemented: not 8086 mode",LOG_PIC)):(this.irq_mask=~e,PIC_LOG_VERBOSE&&dbg_log("interrupt mask: "+(255&this.irq_mask).toString(2)+" ("+this.name+")",LOG_PIC),this.check_irqs()):1===this.state?(this.irq_map=e,dbg_log("interrupts are mapped to "+h(this.irq_map)+" ("+this.name+")",LOG_PIC),this.state++):2===this.state&&(this.state=0,dbg_log("icw3: "+h(e),LOG_PIC))},PIC.prototype.port21_read=function(){return dbg_log("21h read "+h(255&~this.irq_mask),LOG_PIC),255&~this.irq_mask},PIC.prototype.port4D0_read=function(){return dbg_log("elcr read: "+h(this.elcr,2),LOG_PIC),this.elcr},PIC.prototype.port4D0_write=function(e){dbg_log("elcr write: "+h(e,2),LOG_PIC),this.elcr=e}
;var CMOS_RTC_SECONDS_ALARM=1,CMOS_RTC_MINUTES_ALARM=3,CMOS_RTC_HOURS_ALARM=5,CMOS_RTC_DAY_WEEK=6,CMOS_RESET_CODE=15,CMOS_FLOPPY_DRIVE_TYPE=16,CMOS_DISK_DATA=18,CMOS_EQUIPMENT_INFO=20,CMOS_MEM_BASE_LOW=21,CMOS_MEM_BASE_HIGH=22,CMOS_MEM_OLD_EXT_LOW=23,CMOS_MEM_OLD_EXT_HIGH=24,CMOS_DISK_DRIVE1_TYPE=25,CMOS_DISK_DRIVE2_TYPE=26,CMOS_DISK_DRIVE1_CYL=27,CMOS_DISK_DRIVE2_CYL=36,CMOS_MEM_EXTMEM_LOW=48,CMOS_MEM_EXTMEM_HIGH=49,CMOS_MEM_EXTMEM2_LOW=52,CMOS_MEM_EXTMEM2_HIGH=53,CMOS_BIOS_BOOTFLAG1=56,CMOS_BIOS_DISKTRANSFLAG=57,CMOS_BIOS_BOOTFLAG2=61,CMOS_MEM_HIGHMEM_LOW=91,CMOS_MEM_HIGHMEM_MID=92,CMOS_MEM_HIGHMEM_HIGH=93,CMOS_BIOS_SMP_COUNT=95;RTC.prototype.get_state=function(){var e=[];return e[0]=this.cmos_index,e[1]=this.cmos_data,e[2]=this.rtc_time,e[3]=this.last_update,e[4]=this.next_interrupt,e[6]=this.periodic_interrupt,e[7]=this.periodic_interrupt_time,e[8]=this.cmos_a,e[9]=this.cmos_b,e[10]=this.cmos_c,e[11]=this.nmi_disabled,e},RTC.prototype.set_state=function(e){this.cmos_index=e[0],this.cmos_data=e[1],this.rtc_time=e[2],this.last_update=e[3],this.next_interrupt=e[4],this.periodic_interrupt=e[6],this.periodic_interrupt_time=e[7],this.cmos_a=e[8],this.cmos_b=e[9],this.cmos_c=e[10],this.nmi_disabled=e[11]},RTC.prototype.timer=function(e,t){return e=Date.now(),this.rtc_time+=e-this.last_update,this.last_update=e,this.periodic_interrupt&&this.next_interrupt<e?(this.cpu.device_raise_irq(8),this.cmos_c|=192,this.next_interrupt+=this.periodic_interrupt_time*Math.ceil((e-this.next_interrupt)/this.periodic_interrupt_time),Math.max(0,e-this.next_interrupt)):100},RTC.prototype.bcd_pack=function(e){for(var t=0,s=0,r;e;)r=e%10,s|=r<<4*t,t++,e=(e-r)/10;return s},RTC.prototype.encode_time=function(e){return 4&this.cmos_b?e:this.bcd_pack(e)},RTC.prototype.cmos_port_read=function(){var e=this.cmos_index;switch(e){case 0:return this.encode_time(new Date(this.rtc_time).getUTCSeconds());case 2:return this.encode_time(new Date(this.rtc_time).getUTCMinutes());case 4:return this.encode_time(new Date(this.rtc_time).getUTCHours());case 7:return this.encode_time(new Date(this.rtc_time).getUTCDate());case 8:return this.encode_time(new Date(this.rtc_time).getUTCMonth()+1);case 9:return this.encode_time(new Date(this.rtc_time).getUTCFullYear()%100);case 10:return this.cmos_a;case 11:return this.cmos_b;case 12:return this.cpu.device_lower_irq(8),dbg_log("cmos reg C read",LOG_RTC),e=this.cmos_c,this.cmos_c&=-241,e;case 13:return 255;case 50:return this.encode_time(new Date(this.rtc_time).getUTCFullYear()/100|0);default:return dbg_log("cmos read from index "+h(e),LOG_RTC),this.cmos_data[this.cmos_index]}},RTC.prototype.cmos_port_write=function(e){switch(this.cmos_index){case 10:this.cmos_a=127&e,this.periodic_interrupt_time=1e3/(32768>>(15&this.cmos_a)-1),dbg_log("Periodic interrupt, a="+h(this.cmos_a,2)+" t="+this.periodic_interrupt_time,LOG_RTC);break;case 11:this.cmos_b=e,64&this.cmos_b&&(this.next_interrupt=Date.now()),32&this.cmos_b&&dbg_log("Unimplemented: alarm interrupt",LOG_RTC),16&this.cmos_b&&dbg_log("Unimplemented: updated interrupt",LOG_RTC),dbg_log("cmos b="+h(this.cmos_b,2),LOG_RTC);break;default:dbg_log("cmos write index "+h(this.cmos_index)+": "+h(e),LOG_RTC)}this.periodic_interrupt=64==(64&this.cmos_b)&&0<(15&this.cmos_a)},RTC.prototype.cmos_read=function(e){return dbg_assert(128>e),this.cmos_data[e]},RTC.prototype.cmos_write=function(e,t){dbg_log("cmos "+h(e)+" <- "+h(t),LOG_RTC),dbg_assert(128>e),this.cmos_data[e]=t};var DLAB=128,UART_IIR_MSI=0,UART_IIR_NO_INT=1,UART_IIR_THRI=2,UART_IIR_RDI=4,UART_IIR_RLSI=6,UART_IIR_CTI=12,UART_LSR_DATA_READY=1,UART_LSR_TX_EMPTY=32,UART_LSR_TRANSMITTER_EMPTY=64;UART.prototype.get_state=function(){var e=[];return e[0]=this.ints,e[1]=this.baud_rate,e[2]=this.line_control,e[3]=this.lsr,e[4]=this.fifo_control,e[5]=this.ier,e[6]=this.iir,e[7]=this.modem_control,e[8]=this.modem_status,e[9]=this.scratch_register,e[10]=this.irq,e},UART.prototype.set_state=function(e){this.ints=e[0],this.baud_rate=e[1],this.line_control=e[2],this.lsr=e[3],this.fifo_control=e[4],this.ier=e[5],this.iir=e[6],this.modem_control=e[7],this.modem_status=e[8],this.scratch_register=e[9],this.irq=e[10]},UART.prototype.CheckInterrupt=function(){this.ints&1<<UART_IIR_CTI&&1&this.ier?(this.iir=UART_IIR_CTI,this.cpu.device_raise_irq(this.irq)):this.ints&1<<UART_IIR_THRI&&2&this.ier?(this.iir=UART_IIR_THRI,this.cpu.device_raise_irq(this.irq)):this.ints&1<<UART_IIR_MSI&&8&this.ier?(this.iir=UART_IIR_MSI,this.cpu.device_raise_irq(this.irq)):(this.iir=UART_IIR_NO_INT,this.cpu.device_lower_irq(this.irq))},UART.prototype.ThrowInterrupt=function(e){this.ints|=1<<e,this.CheckInterrupt()},UART.prototype.ClearInterrupt=function(e){this.ints&=~(1<<e),this.CheckInterrupt()},UART.prototype.data_received=function(e){dbg_log("input: "+h(e),LOG_SERIAL),this.input.push(e),this.lsr|=UART_LSR_DATA_READY,this.ThrowInterrupt(UART_IIR_CTI)},UART.prototype.write_data=function(e){if(this.line_control&DLAB)this.baud_rate=-256&this.baud_rate|e;else if(dbg_log("data: "+h(e),LOG_SERIAL),this.ThrowInterrupt(UART_IIR_THRI),255!==e){var t=String.fromCharCode(e);this.bus.send("serial0-output-char",t),this.current_line.push(e),"\n"===t&&(dbg_log("SERIAL: "+String.fromCharCode.apply("",this.current_line).trimRight()),this.bus.send("serial0-output-line",String.fromCharCode.apply("",this.current_line)),this.current_line=[])}};var HPET_ADDR=4275044352,HPET_PERIOD=1e8,HPET_FREQ_MS=1e12/HPET_PERIOD,HPET_SUPPORT_64=0,HPET_COUNTER_CONFIG=16|HPET_SUPPORT_64<<5,HPET_COUNTER_CONFIG_MASK=32816,HPET_NUM_COUNTERS=4;ACPI.prototype.timer=function(e){e=this.get_timer(e);var t=0!=(8388608&(e^this.last_timer));1&this.pm1_enable&&t?(dbg_log("ACPI raise irq",LOG_ACPI),this.pm1_status|=1,this.cpu.device_raise_irq(9)):this.cpu.device_lower_irq(9),this.last_timer=e},ACPI.prototype.get_timer=function(e){return 3579.545*e|0},ACPI.prototype.get_state=function(){var e=[];return e[0]=this.status,e[1]=this.pm1_status,e[2]=this.pm1_enable,e},ACPI.prototype.set_state=function(e){this.status=e[0],this.pm1_status=e[1],this.pm1_enable=e[2]};var APIC_LOG_VERBOSE=!1,APIC_ADDRESS=4276092928,APIC_TIMER_MODE_TSC=262144,DELIVERY_MODES="Fixed (0);Lowest Prio (1);SMI (2);Reserved (3);NMI (4);INIT (5);Reserved (6);ExtINT (7)".split(";"),DESTINATION_MODES=["physical","logical"];APIC.prototype.read32=function(e){switch(e=e-APIC_ADDRESS|0){case 32:return dbg_log("APIC read id",LOG_APIC),this.apic_id;case 48:return dbg_log("APIC read version",LOG_APIC),327700;case 128:return APIC_LOG_VERBOSE&&dbg_log("APIC read tpr",LOG_APIC),this.tpr;case 208:return dbg_log("Read local destination",LOG_APIC),this.local_destination;case 224:return dbg_log("Read destination format",LOG_APIC),this.destination_format;case 240:return this.spurious_vector;case 256:case 272:case 288:case 304:case 320:case 336:case 352:case 368:return e=e-256>>4,dbg_log("Read isr "+e+": "+h(this.isr[e]>>>0,8),LOG_APIC),this.isr[e];case 384:case 400:case 416:case 432:case 448:case 464:case 480:case 496:return e=e-384>>4,dbg_log("Read tmr "+e+": "+h(this.tmr[e]>>>0,8),LOG_APIC),this.tmr[e];case 512:case 528:case 544:case 560:case 576:case 592:case 608:case 624:return e=e-512>>4,dbg_log("Read irr "+e+": "+h(this.irr[e]>>>0,8),LOG_APIC),this.irr[e];case 640:return dbg_log("Read error: "+h(this.read_error>>>0,8),LOG_APIC),this.read_error;case 768:return APIC_LOG_VERBOSE&&dbg_log("APIC read icr0",LOG_APIC),this.icr0;case 784:return dbg_log("APIC read icr1",LOG_APIC),this.icr1;case 800:return dbg_log("read timer lvt",LOG_APIC),this.lvt_timer;case 832:return dbg_log("read lvt perf counter",LOG_APIC),this.lvt_perf_counter;case 848:return dbg_log("read lvt int0",LOG_APIC),this.lvt_int0;case 864:return dbg_log("read lvt int1",LOG_APIC),this.lvt_int1;case 880:return dbg_log("read lvt error",LOG_APIC),this.lvt_error;case 992:return dbg_log("read timer divider",LOG_APIC),this.timer_divider;case 896:return dbg_log("read timer initial count",LOG_APIC),this.timer_initial_count;case 912:return dbg_log("read timer current count: "+h(this.timer_current_count>>>0,8),LOG_APIC),this.timer_current_count;default:return dbg_log("APIC read "+h(e),LOG_APIC),dbg_assert(!1),0}},APIC.prototype.write32=function(e,t){switch(e=e-APIC_ADDRESS|0){case 48:dbg_log("APIC write version: "+h(t>>>0,8)+", ignored",LOG_APIC);break;case 128:APIC_LOG_VERBOSE&&dbg_log("Set tpr: "+h(255&t,2),LOG_APIC),this.tpr=255&t,this.check_vector();break;case 176:e=this.highest_isr(),-1!==e?(APIC_LOG_VERBOSE&&dbg_log("eoi: "+h(t>>>0,8)+" for vector "+h(e),LOG_APIC),this.register_clear_bit(this.isr,e),this.register_get_bit(this.tmr,e)&&this.cpu.devices.ioapic.remote_eoi(e),this.check_vector()):dbg_log("Bad eoi: No isr set",LOG_APIC);break;case 208:dbg_log("Set local destination: "+h(t>>>0,8),LOG_APIC),this.local_destination=4278190080&t;break;case 224:dbg_log("Set destination format: "+h(t>>>0,8),LOG_APIC),this.destination_format=16777215|t;break;case 240:dbg_log("Set spurious vector: "+h(t>>>0,8),LOG_APIC),this.spurious_vector=t;break;case 640:dbg_log("Write error: "+h(t>>>0,8),LOG_APIC),this.read_error=this.error,this.error=0;break;case 768:e=255&t;var s=t>>8&7,r=t>>11&1,i=t>>15&1,_=t>>18&3,a=this.icr1>>>24;dbg_log("APIC write icr0: "+h(t,8)+" vector="+h(e,2)+" destination_mode="+DESTINATION_MODES[r]+" delivery_mode="+DELIVERY_MODES[s]+" destination_shorthand="+["no","self","all with self","all without self"][_],LOG_APIC),this.icr0=-4097&t,0===_?this.route(e,s,i,a,r):1===_?this.deliver(e,IOAPIC_DELIVERY_FIXED,i):2===_?this.deliver(e,s,i):3!==_&&dbg_assert(!1);break;case 784:dbg_log("APIC write icr1: "+h(t>>>0,8),LOG_APIC),this.icr1=t;break;case 800:dbg_log("timer lvt: "+h(t>>>0,8),LOG_APIC),this.lvt_timer=t;break;case 832:dbg_log("lvt perf counter: "+h(t>>>0,8),LOG_APIC),this.lvt_perf_counter=t;break;case 848:dbg_log("lvt int0: "+h(t>>>0,8),LOG_APIC),this.lvt_int0=t;break;case 864:dbg_log("lvt int1: "+h(t>>>0,8),LOG_APIC),this.lvt_int1=t;break;case 880:dbg_log("lvt error: "+h(t>>>0,8),LOG_APIC),this.lvt_error=t;break;case 992:dbg_log("timer divider: "+h(t>>>0,8),LOG_APIC),this.timer_divider=t,t=3&t|(8&t)>>1,this.timer_divider_shift=7===t?0:t+1;break;case 896:dbg_log("timer initial: "+h(t>>>0,8),LOG_APIC),this.timer_initial_count=t>>>0,this.timer_current_count=t>>>0,this.next_tick=v86.microtick(),this.timer_active=!0;break;case 912:dbg_log("timer current: "+h(t>>>0,8),LOG_APIC),dbg_assert(!1,"read-only register");break;default:dbg_log("APIC write32 "+h(e)+" <- "+h(t>>>0,8),LOG_APIC),dbg_assert(!1)}},APIC.prototype.timer=function(e){0!==this.timer_current_count&&0!=(e=(e-this.next_tick)*TSC_RATE/(1<<this.timer_divider_shift)>>>0)&&(this.next_tick+=e/TSC_RATE*(1<<this.timer_divider_shift),this.timer_current_count-=e,0>=this.timer_current_count&&(e=393216&this.lvt_timer,131072===e?(this.timer_current_count=this.timer_initial_count,0==(this.lvt_timer&IOAPIC_CONFIG_MASKED)&&this.deliver(255&this.lvt_timer,IOAPIC_DELIVERY_FIXED,!1)):0===e&&(this.timer_current_count=0,dbg_log("APIC timer one shot end",LOG_APIC),0==(this.lvt_timer&IOAPIC_CONFIG_MASKED)&&this.deliver(255&this.lvt_timer,IOAPIC_DELIVERY_FIXED,!1))))},APIC.prototype.route=function(e,t,s,r,i){this.deliver(e,t,s)},APIC.prototype.deliver=function(e,t,s){APIC_LOG_VERBOSE&&dbg_log("Deliver "+h(e,2)+" mode="+t+" level="+s,LOG_APIC),t!==IOAPIC_DELIVERY_INIT&&t!==IOAPIC_DELIVERY_NMI&&((16>e||255===e)&&dbg_assert(!1,"TODO: Invalid vector"),this.register_get_bit(this.irr,e)?dbg_log("Not delivered: irr already set, vector="+h(e,2),LOG_APIC):(this.register_set_bit(this.irr,e),s?this.register_set_bit(this.tmr,e):this.register_clear_bit(this.tmr,e),this.check_vector()))},APIC.prototype.highest_irr=function(){var e=this.register_get_highest_bit(this.irr);return dbg_assert(255!==e),dbg_assert(16<=e||-1===e),e},APIC.prototype.highest_isr=function(){var e=this.register_get_highest_bit(this.isr);return dbg_assert(255!==e),dbg_assert(16<=e||-1===e),e},APIC.prototype.check_vector=function(){var e=this.highest_irr();if(-1!==e){var t=this.highest_isr();t>=e?APIC_LOG_VERBOSE&&dbg_log("Higher isr, isr="+h(t)+" irr="+h(e),LOG_APIC):(240&e)<=(240&this.tpr)?APIC_LOG_VERBOSE&&dbg_log("Higher tpr, tpr="+h(240&this.tpr)+" irr="+h(e),LOG_APIC):this.cpu.handle_irqs()}},APIC.prototype.acknowledge_irq=function(){var e=this.highest_irr();if(-1!==e){var t=this.highest_isr();t>=e?APIC_LOG_VERBOSE&&dbg_log("Higher isr, isr="+h(t)+" irr="+h(e),LOG_APIC):(240&e)<=(240&this.tpr)?APIC_LOG_VERBOSE&&dbg_log("Higher tpr, tpr="+h(240&this.tpr)+" irr="+h(e),LOG_APIC):(this.register_clear_bit(this.irr,e),this.register_set_bit(this.isr,e),APIC_LOG_VERBOSE&&dbg_log("Calling vector "+h(e),LOG_APIC),this.cpu.pic_call_irq(e),this.check_vector())}},APIC.prototype.get_state=function(){var e=[];return e[0]=this.apic_id,e[1]=this.timer_divider,e[2]=this.timer_divider_shift,e[3]=this.timer_initial_count,e[4]=this.timer_current_count,e[5]=this.next_tick,e[6]=this.lvt_timer,e[7]=this.lvt_perf_counter,e[8]=this.lvt_int0,e[9]=this.lvt_int1,e[10]=this.lvt_error,e[11]=this.tpr,e[12]=this.icr0,e[13]=this.icr1,e[14]=this.irr,e[15]=this.isr,e[16]=this.tmr,e[17]=this.spurious_vector,e[18]=this.destination_format,e[19]=this.local_destination,e[20]=this.error,e[21]=this.read_error,e},APIC.prototype.set_state=function(e){this.apic_id=e[0],this.timer_divider=e[1],this.timer_divider_shift=e[2],this.timer_initial_count=e[3],this.timer_current_count=e[4],this.next_tick=e[5],this.lvt_timer=e[6],this.lvt_perf_counter=e[7],this.lvt_int0=e[8],this.lvt_int1=e[9],this.lvt_error=e[10],this.tpr=e[11],this.icr0=e[12],this.icr1=e[13],this.irr=e[14],this.isr=e[15],this.tmr=e[16],this.spurious_vector=e[17],this.destination_format=e[18],this.local_destination=e[19],this.error=e[20],this.read_error=e[21]},APIC.prototype.register_get_bit=function(e,t){return dbg_assert(0<=t&&256>t),e[t>>5]>>(31&t)&1},APIC.prototype.register_set_bit=function(e,t){dbg_assert(0<=t&&256>t),e[t>>5]|=1<<(31&t)},APIC.prototype.register_clear_bit=function(e,t){dbg_assert(0<=t&&256>t),e[t>>5]&=~(1<<(31&t))},APIC.prototype.register_get_highest_bit=function(e){for(var t=7;0<=t;t--){var s=e[t];if(s)return v86util.int_log2(s>>>0)|t<<5}return-1};var IOAPIC_ADDRESS=4273995776,IOREGSEL=0,IOWIN=16,IOAPIC_IRQ_COUNT=24,IOAPIC_ID=0,IOAPIC_CONFIG_TRIGGER_MODE_LEVEL=32768,IOAPIC_CONFIG_MASKED=65536,IOAPIC_CONFIG_DELIVS=4096,IOAPIC_CONFIG_REMOTE_IRR=16384,IOAPIC_CONFIG_READONLY_MASK=IOAPIC_CONFIG_REMOTE_IRR|IOAPIC_CONFIG_DELIVS|4294836224,IOAPIC_DELIVERY_FIXED=0,IOAPIC_DELIVERY_NMI=4,IOAPIC_DELIVERY_INIT=5;IOAPIC.prototype.remote_eoi=function(e){for(var t=0;t<IOAPIC_IRQ_COUNT;t++){var s=this.ioredtbl_config[t];(255&s)===e&&s&IOAPIC_CONFIG_REMOTE_IRR&&(dbg_log("Clear remote IRR for irq="+h(t),LOG_APIC),this.ioredtbl_config[t]&=~IOAPIC_CONFIG_REMOTE_IRR,this.check_irq(t))}},IOAPIC.prototype.check_irq=function(e){var t=1<<e;if(0!=(this.irr&t)){var s=this.ioredtbl_config[e];if(0==(s&IOAPIC_CONFIG_MASKED)){var r=s>>8&7,i=s>>11&1,_=255&s,a=this.ioredtbl_destination[e]>>>24,o=(s&IOAPIC_CONFIG_TRIGGER_MODE_LEVEL)===IOAPIC_CONFIG_TRIGGER_MODE_LEVEL;if(0==(s&IOAPIC_CONFIG_TRIGGER_MODE_LEVEL))this.irr&=~t;else if(this.ioredtbl_config[e]|=IOAPIC_CONFIG_REMOTE_IRR,s&IOAPIC_CONFIG_REMOTE_IRR)return void dbg_log("No route: level interrupt and remote IRR still set",LOG_APIC);r===IOAPIC_DELIVERY_FIXED||1===r?this.cpu.devices.apic.route(_,r,o,a,i):dbg_assert(!1,"TODO"),this.ioredtbl_config[e]&=~IOAPIC_CONFIG_DELIVS}}},IOAPIC.prototype.set_irq=function(e){if(e>=IOAPIC_IRQ_COUNT)dbg_assert(!1,"Bad irq: "+e,LOG_APIC);else{var t=1<<e;0==(this.irq_value&t)&&(APIC_LOG_VERBOSE&&dbg_log("apic set irq "+e,LOG_APIC),this.irq_value|=t,(this.ioredtbl_config[e]&(IOAPIC_CONFIG_TRIGGER_MODE_LEVEL|IOAPIC_CONFIG_MASKED))!==IOAPIC_CONFIG_MASKED&&(this.irr|=t,this.check_irq(e)))}},IOAPIC.prototype.clear_irq=function(e){if(e>=IOAPIC_IRQ_COUNT)dbg_assert(!1,"Bad irq: "+e,LOG_APIC);else{var t=1<<e;(this.irq_value&t)===t&&(this.irq_value&=~t,this.ioredtbl_config[e]&IOAPIC_CONFIG_TRIGGER_MODE_LEVEL&&(this.irr&=~t))}},IOAPIC.prototype.read=function(e){if(0===e)return dbg_log("IOAPIC Read id",LOG_APIC),this.ioapic_id<<24;if(1===e)return dbg_log("IOAPIC Read version",LOG_APIC),17|IOAPIC_IRQ_COUNT-1<<16;if(2===e)return dbg_log("IOAPIC Read arbitration id",LOG_APIC),this.ioapic_id<<24;if(16<=e&&e<16+2*IOAPIC_IRQ_COUNT){var t=e-16>>1;return 1&e?(e=this.ioredtbl_destination[t],dbg_log("IOAPIC Read destination irq="+h(t)+" -> "+h(e,8),LOG_APIC)):(e=this.ioredtbl_config[t],dbg_log("IOAPIC Read config irq="+h(t)+" -> "+h(e,8),LOG_APIC)),e}return dbg_log("IOAPIC register read outside of range "+h(e),LOG_APIC),dbg_assert(!1),0},IOAPIC.prototype.write=function(e,t){if(0===e)this.ioapic_id=t>>>24&15;else if(1===e||2===e)dbg_log("Invalid write: "+e,LOG_APIC);else if(16<=e&&e<16+2*IOAPIC_IRQ_COUNT){var s=e-16>>1;if(1&e)this.ioredtbl_destination[s]=4278190080&t,dbg_log("Write destination "+h(t>>>0,8)+" irq="+h(s)+" dest="+h(t>>>24,2),LOG_APIC);else{this.ioredtbl_config[s]=t&~IOAPIC_CONFIG_READONLY_MASK|this.ioredtbl_config[s]&IOAPIC_CONFIG_READONLY_MASK,e=255&t;var r=t>>8&7,i=t>>11&1,_=t>>15&1,a=t>>16&1;dbg_log("Write config "+h(t>>>0,8)+" irq="+h(s)+" vector="+h(e,2)+" deliverymode="+DELIVERY_MODES[r]+" destmode="+DESTINATION_MODES[i]+" is_level="+_+" disabled="+a,LOG_APIC),this.check_irq(s)}}else dbg_log("IOAPIC register write outside of range "+h(e)+": "+h(t>>>0,8),LOG_APIC),dbg_assert(!1)},IOAPIC.prototype.get_state=function(){var e=[];return e[0]=this.ioredtbl_config,e[1]=this.ioredtbl_destination,e[2]=this.ioregsel,e[3]=this.ioapic_id,e[4]=this.irr,e[5]=this.irq_value,e},IOAPIC.prototype.set_state=function(e){this.ioredtbl_config=e[0],this.ioredtbl_destination=e[1],this.ioregsel=e[2],this.ioapic_id=e[3],this.irr=e[4],this.irq_value=e[5]};var STATE_VERSION=4,STATE_MAGIC=-2039052682,STATE_INDEX_MAGIC=0,STATE_INDEX_VERSION=1,STATE_INDEX_TOTAL_LEN=2,STATE_INDEX_INFO_LEN=3,STATE_INFO_BLOCK_START=16;StateLoadError.prototype=Error(),CPU.prototype.save_state=function(){for(var e=[],t=save_object(this,e),s=[],r=0,i=0;i<e.length;i++){var _=e[i].byteLength;s[i]={offset:r,length:_},r+=_,r=r+3&-4}t=JSON.stringify({buffer_infos:s,state:t}),i=STATE_INFO_BLOCK_START+2*t.length,i=i+3&-4;var a=i+r;r=new ArrayBuffer(a);var o=new Int32Array(r,0,STATE_INFO_BLOCK_START/4);_=new Uint16Array(r,STATE_INFO_BLOCK_START,t.length);var n=new Uint8Array(r,i);for(o[STATE_INDEX_MAGIC]=STATE_MAGIC,o[STATE_INDEX_VERSION]=STATE_VERSION,o[STATE_INDEX_TOTAL_LEN]=a,o[STATE_INDEX_INFO_LEN]=2*t.length,i=0;i<t.length;i++)_[i]=t.charCodeAt(i);for(i=0;i<e.length;i++)t=e[i],dbg_assert(t.constructor===Uint8Array),n.set(t,s[i].offset);return r},CPU.prototype.restore_state=function(e){var t=e.byteLength;if(t<STATE_INFO_BLOCK_START)throw new StateLoadError("Invalid length: "+t);var s=new Int32Array(e,0,4);if(s[STATE_INDEX_MAGIC]!==STATE_MAGIC)throw new StateLoadError("Invalid header: "+h(s[STATE_INDEX_MAGIC]>>>0));if(s[STATE_INDEX_VERSION]!==STATE_VERSION)throw new StateLoadError("Version mismatch: dump="+s[STATE_INDEX_VERSION]+" we="+STATE_VERSION);if(s[STATE_INDEX_TOTAL_LEN]!==t)throw new StateLoadError("Length doesn't match header: real="+t+" header="+s[STATE_INDEX_TOTAL_LEN]);if(0>(s=s[STATE_INDEX_INFO_LEN])||s+12>=t||s%2)throw new StateLoadError("Invalid info block length: "+s);var r=s/2,i=new Uint16Array(e,STATE_INFO_BLOCK_START,r),_="";for(t=0;t<r-8;)_+=String.fromCharCode(i[t++],i[t++],i[t++],i[t++],i[t++],i[t++],i[t++],i[t++]);for(;t<r;)_+=String.fromCharCode(i[t++]);for(t=JSON.parse(_),r=t.state,i=t.buffer_infos,s=STATE_INFO_BLOCK_START+s,s=s+3&-4,t=0;t<i.length;t++)i[t].offset+=s;restore_object(this,r,{full:e,infos:i})};var E8390_CMD=0,EN0_CLDALO=1,EN0_STARTPG=1,EN0_CLDAHI=2,EN0_STOPPG=2,EN0_BOUNDARY=3,EN0_TSR=4,EN0_TPSR=4,EN0_NCR=5,EN0_TCNTLO=5,EN0_FIFO=6,EN0_TCNTHI=6,EN0_ISR=7,EN0_CRDALO=8,EN0_RSARLO=8,EN0_CRDAHI=9,EN0_RSARHI=9,EN0_RCNTLO=10,EN0_RCNTHI=11,EN0_RSR=12,EN0_RXCR=12,EN0_TXCR=13,EN0_COUNTER0=13,EN0_DCFG=14,EN0_COUNTER1=14,EN0_IMR=15,EN0_COUNTER2=15,NE_DATAPORT=16,NE_RESET=31,ENISR_TX=2,ENISR_RX_ERR=4,ENISR_TX_ERR=8,ENISR_OVER=16,ENISR_COUNTERS=32,ENISR_RDC=64,ENISR_RESET=128,ENISR_ALL=63,START_PAGE=64,START_RX_PAGE=76,STOP_PAGE=128;Ne2k.prototype.get_state=function(){var e=[];return e[0]=this.isr,e[1]=this.imr,e[2]=this.cr,e[3]=this.dcfg,e[4]=this.rcnt,e[5]=this.tcnt,e[6]=this.tpsr,e[7]=this.rsar,e[8]=this.pstart,e[9]=this.curpg,e[10]=this.boundary,e},Ne2k.prototype.set_state=function(e){this.isr=e[0],this.imr=e[1],this.cr=e[2],this.dcfg=e[3],this.rcnt=e[4],this.tcnt=e[5],this.tpsr=e[6],this.rsar=e[7],this.pstart=e[8],this.curpg=e[9],this.boundary=e[10]},Ne2k.prototype.do_interrupt=function(e){dbg_log("Do interrupt "+h(e,2),LOG_NET),this.isr|=e,this.update_irq()},Ne2k.prototype.update_irq=function(){this.imr&this.isr?this.pci.raise_irq(this.pci_id):this.pci.lower_irq(this.pci_id)},Ne2k.prototype.data_port_write=function(e){dbg_log("Write data port: data="+h(255&e,2)+" rsar="+h(this.rsar,4)+" rcnt="+h(this.rcnt,4),LOG_NET),16<this.rsar&&this.rsar<START_PAGE<<8||(this.rcnt--,this.memory[this.rsar++]=e,this.rsar>=this.pstop<<8&&(this.rsar+=this.pstart-this.pstop<<8),0===this.rcnt&&this.do_interrupt(ENISR_RDC))},Ne2k.prototype.data_port_write16=function(e){this.data_port_write(e),1&this.dcfg&&this.data_port_write(e>>8)},Ne2k.prototype.data_port_write32=function(e){this.data_port_write(e),this.data_port_write(e>>8),this.data_port_write(e>>16),this.data_port_write(e>>24)},Ne2k.prototype.data_port_read=function(){var e=this.memory[this.rsar++];return dbg_log("Read data port: data="+h(e,2)+" rsar="+h(this.rsar-1,4)+" rcnt="+h(this.rcnt,4),LOG_NET),this.rcnt--,this.rsar>=this.pstop<<8&&(this.rsar+=this.pstart-this.pstop<<8),0===this.rcnt&&this.do_interrupt(ENISR_RDC),e},Ne2k.prototype.data_port_read8=function(){return 255&this.data_port_read16()},Ne2k.prototype.data_port_read16=function(){return 1&this.dcfg?this.data_port_read()|this.data_port_read()<<8:this.data_port_read()},Ne2k.prototype.data_port_read32=function(){return this.data_port_read()|this.data_port_read()<<8|this.data_port_read()<<16|this.data_port_read()<<24},Ne2k.prototype.receive=function(e){if(!(1&this.cr)&&(this.bus.send("eth-receive-end",[e.length]),16&this.rxcr||4&this.rxcr&&255===e[0]&&255===e[1]&&255===e[2]&&255===e[3]&&255===e[4]&&255===e[5]||!(8&this.rxcr&&1==(1&e[0])||e[0]!==this.memory[0]||e[1]!==this.memory[2]||e[2]!==this.memory[4]||e[3]!==this.memory[6]||e[4]!==this.memory[8]||e[5]!==this.memory[10]))){var t=this.curpg<<8,s=Math.max(60,e.length)+4,r=t+4,i=this.curpg+1+(s>>8);if(t+s>this.memory.length){dbg_assert(60<=e.length);var _=this.memory.length-r;this.memory.set(e.subarray(0,_),r),this.memory.set(e.subarray(_),START_RX_PAGE),dbg_log("rcv cut="+h(_),LOG_NET)}else if(this.memory.set(e,r),60>e.length)for(e=e.length;60>e;e++)this.memory[r+e]=0;i>=this.pstop&&(i+=this.pstart-this.pstop),this.memory[t]=1,this.memory[t+1]=i,this.memory[t+2]=s,this.memory[t+3]=s>>8,this.curpg=i,dbg_log("rcv offset="+h(t)+" len="+h(s)+" next="+h(i),LOG_NET),this.do_interrupt(1)}},Ne2k.prototype.get_page=function(){return 192&this.cr};var DSP_COPYRIGHT="COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.",DSP_NO_COMMAND=0,DSP_BUFSIZE=64,DSP_DACSIZE=65536,SB_DMA_BUFSIZE=65536,SB_DMA_BLOCK_SAMPLES=1024,SB_DMA0=0,SB_DMA1=1,SB_DMA3=3,SB_DMA5=5,SB_DMA6=6,SB_DMA7=7,SB_DMA_CHANNEL_8BIT=SB_DMA1,SB_DMA_CHANNEL_16BIT=SB_DMA5,SB_IRQ2=2,SB_IRQ5=5,SB_IRQ7=7,SB_IRQ10=10,SB_IRQ=SB_IRQ5,SB_IRQ_8BIT=1,SB_IRQ_16BIT=2,SB_IRQ_MIDI=1,SB_IRQ_MPU=4,DSP_COMMAND_SIZES=new Uint8Array(256),DSP_COMMAND_HANDLERS=[],MIXER_READ_HANDLERS=[],MIXER_WRITE_HANDLERS=[],FM_HANDLERS=[];SB16.prototype.reset_dsp=function(){this.write_buffer.clear(),this.read_buffer.clear(),this.command=DSP_NO_COMMAND,this.command_size=0,this.dummy_speaker_enabled=!1,this.test_register=0,this.dsp_signed=this.dsp_16bit=this.dsp_stereo=this.dsp_highspeed=!1,this.dac_buffers[0].clear(),this.dac_buffers[1].clear(),this.dac_rate_ratio=2,this.dma_channel=this.dma_irq=this.dma_bytes_block=this.dma_bytes_left=this.dma_bytes_count=this.dma_sample_count=0,this.dma_autoinit=!1,this.dma_buffer_uint8.fill(0),this.dma_paused=this.dma_waiting_transfer=!1,this.e2_value=170,this.e2_count=0,this.sampling_rate=22050,this.bytes_per_sample=1,this.lower_irq(SB_IRQ_8BIT),this.irq_triggered.fill(0),this.asp_registers.fill(0),this.asp_registers[5]=1,this.asp_registers[9]=248},SB16.prototype.get_state=function(){var e=[];return e[2]=this.read_buffer_lastvalue,e[3]=this.command,e[4]=this.command_size,e[5]=this.mixer_current_address,e[6]=this.mixer_unhandled_registers,e[7]=this.dummy_speaker_enabled,e[8]=this.test_register,e[9]=this.dsp_highspeed,e[10]=this.dsp_stereo,e[11]=this.dsp_16bit,e[12]=this.dsp_signed,e[14]=this.dac_rate_ratio,e[15]=this.dma_sample_count,e[16]=this.dma_bytes_count,e[17]=this.dma_bytes_left,e[18]=this.dma_bytes_block,e[19]=this.dma_irq,e[20]=this.dma_channel,e[21]=this.dma_channel_8bit,e[22]=this.dma_channel_16bit,e[23]=this.dma_autoinit,e[24]=this.dma_buffer_uint8,e[25]=this.dma_waiting_transfer,e[26]=this.dma_paused,e[27]=this.sampling_rate,e[28]=this.bytes_per_sample,e[29]=this.e2_value,e[30]=this.e2_count,e[31]=this.asp_registers,e[33]=this.mpu_read_buffer_last_value,e[34]=this.irq,e[35]=this.irq_triggered,e[36]=this.audio_samplerate,e},SB16.prototype.set_state=function(e){this.read_buffer_lastvalue=e[2],this.command=e[3],this.command_size=e[4],this.mixer_current_address=e[5],this.mixer_unhandled_registers=e[6],this.dummy_speaker_enabled=e[7],this.test_register=e[8],this.dsp_highspeed=e[9],this.dsp_stereo=e[10],this.dsp_16bit=e[11],this.dsp_signed=e[12],this.dac_rate_ratio=e[14],this.dma_sample_count=e[15],this.dma_bytes_count=e[16],this.dma_bytes_left=e[17],this.dma_bytes_block=e[18],this.dma_irq=e[19],this.dma_channel=e[20],this.dma_channel_8bit=e[21],this.dma_channel_16bit=e[22],this.dma_autoinit=e[23],this.dma_buffer_uint8=e[24],this.dma_waiting_transfer=e[25],this.dma_paused=e[26],this.sampling_rate=e[27],this.bytes_per_sample=e[28],this.e2_value=e[29],this.e2_count=e[30],this.asp_registers=e[31],this.mpu_read_buffer_last_value=e[33],this.irq=e[34],this.irq_triggered=e[35],this.audio_samplerate=e[36],this.dma_buffer=this.dma_buffer_uint8.buffer,this.dma_buffer_int8=new Int8Array(this.dma_buffer),this.dma_buffer_int16=new Int16Array(this.dma_buffer),this.dma_buffer_uint16=new Uint16Array(this.dma_buffer),this.dma_syncbuffer=new SyncBuffer(this.dma_buffer),this.bus.send("speaker-update-enable",!this.dma_paused)},SB16.prototype.port2x0_read=function(){return dbg_log("220 read: fm music status port (unimplemented)",LOG_SB16),255},SB16.prototype.port2x1_read=function(){return dbg_log("221 read: fm music data port (write only)",LOG_SB16),255},SB16.prototype.port2x2_read=function(){return dbg_log("222 read: advanced fm music status port (unimplemented)",LOG_SB16),255},SB16.prototype.port2x3_read=function(){return dbg_log("223 read: advanced music data port (write only)",LOG_SB16),255},SB16.prototype.port2x4_read=function(){return dbg_log("224 read: mixer address port",LOG_SB16),this.mixer_current_address},SB16.prototype.port2x5_read=function(){dbg_log("225 read: mixer data port",LOG_SB16);var e=MIXER_READ_HANDLERS[this.mixer_current_address];return e||(e=this.mixer_default_read),e.call(this)},SB16.prototype.port2x6_read=function(){return dbg_log("226 read: (write only)",LOG_SB16),255},SB16.prototype.port2x7_read=function(){return dbg_log("227 read: undocumented",LOG_SB16),255},SB16.prototype.port2x8_read=function(){return dbg_log("228 read: fm music status port (unimplemented)",LOG_SB16),255},SB16.prototype.port2x9_read=function(){return dbg_log("229 read: fm music data port (write only)",LOG_SB16),255},SB16.prototype.port2xA_read=function(){return dbg_log("22A read: read data",LOG_SB16),this.read_buffer.length&&(this.read_buffer_lastvalue=this.read_buffer.shift()),dbg_log(" <- "+this.read_buffer_lastvalue+" "+h(this.read_buffer_lastvalue)+" '"+String.fromCharCode(this.read_buffer_lastvalue)+"'",LOG_SB16),this.read_buffer_lastvalue},SB16.prototype.port2xB_read=function(){return dbg_log("22B read: undocumented",LOG_SB16),255},SB16.prototype.port2xC_read=function(){return dbg_log("22C read: write-buffer status",LOG_SB16),127},SB16.prototype.port2xD_read=function(){return dbg_log("22D read: undocumented",LOG_SB16),255},SB16.prototype.port2xE_read=function(){return dbg_log("22E read: read-buffer status / irq 8bit ack.",LOG_SB16),this.irq_triggered[SB_IRQ_8BIT]&&this.lower_irq(SB_IRQ_8BIT),(this.read_buffer.length&&!this.dsp_highspeed)<<7|127},SB16.prototype.port2xF_read=function(){return dbg_log("22F read: irq 16bit ack",LOG_SB16),this.lower_irq(SB_IRQ_16BIT),0},SB16.prototype.port2x0_write=function(e){dbg_log("220 write: (unimplemented) fm register 0 address = "+h(e),LOG_SB16),this.fm_current_address0=0},SB16.prototype.port2x1_write=function(e){dbg_log("221 write: (unimplemented) fm register 0 data = "+h(e),LOG_SB16);var t=FM_HANDLERS[this.fm_current_address0];t||(t=this.fm_default_write),t.call(this,e,0,this.fm_current_address0)},SB16.prototype.port2x2_write=function(e){dbg_log("222 write: (unimplemented) fm register 1 address = "+h(e),LOG_SB16),this.fm_current_address1=0},SB16.prototype.port2x3_write=function(e){dbg_log("223 write: (unimplemented) fm register 1 data ="+h(e),LOG_SB16);var t=FM_HANDLERS[this.fm_current_address1];t||(t=this.fm_default_write),t.call(this,e,1,this.fm_current_address1)},SB16.prototype.port2x4_write=function(e){dbg_log("224 write: mixer address = "+h(e),LOG_SB16),this.mixer_current_address=e},SB16.prototype.port2x5_write=function(e){dbg_log("225 write: mixer data = "+h(e),LOG_SB16);var t=MIXER_WRITE_HANDLERS[this.mixer_current_address];t||(t=this.mixer_default_write),t.call(this,e)},SB16.prototype.port2x6_write=function(e){dbg_log("226 write: reset = "+h(e),LOG_SB16),this.dsp_highspeed?(dbg_log(" -> exit highspeed",LOG_SB16),this.dsp_highspeed=!1):e&&(dbg_log(" -> reset",LOG_SB16),this.reset_dsp()),this.read_buffer.clear(),this.read_buffer.push(170)},SB16.prototype.port2x7_write=function(e){dbg_log("227 write: undocumented",LOG_SB16)},SB16.prototype.port2x8_write=function(e){dbg_log("228 write: fm music register port (unimplemented)",LOG_SB16)},SB16.prototype.port2x9_write=function(e){dbg_log("229 write: fm music data port (unimplemented)",LOG_SB16)},SB16.prototype.port2xA_write=function(e){dbg_log("22A write: dsp read data port (read only)",LOG_SB16)},SB16.prototype.port2xB_write=function(e){dbg_log("22B write: undocumented",LOG_SB16)},SB16.prototype.port2xC_write=function(e){dbg_log("22C write: write command/data",LOG_SB16),this.command===DSP_NO_COMMAND?(dbg_log("22C write: command = "+h(e),LOG_SB16),this.command=e,this.write_buffer.clear(),this.command_size=DSP_COMMAND_SIZES[e]):(dbg_log("22C write: data: "+h(e),LOG_SB16),this.write_buffer.push(e)),this.write_buffer.length>=this.command_size&&this.command_do()},SB16.prototype.port2xD_write=function(e){dbg_log("22D write: undocumented",LOG_SB16)},SB16.prototype.port2xE_write=function(e){dbg_log("22E write: dsp read buffer status (read only)",LOG_SB16)},SB16.prototype.port2xF_write=function(e){dbg_log("22F write: undocumented",LOG_SB16)},SB16.prototype.port3x0_read=function(){return dbg_log("330 read: mpu data",LOG_SB16),this.mpu_read_buffer.length&&(this.mpu_read_buffer_lastvalue=this.mpu_read_buffer.shift()),dbg_log(" <- "+h(this.mpu_read_buffer_lastvalue),LOG_SB16),this.mpu_read_buffer_lastvalue},SB16.prototype.port3x0_write=function(e){dbg_log("330 write: mpu data (unimplemented) : "+h(e),LOG_SB16)},SB16.prototype.port3x1_read=function(){return dbg_log("331 read: mpu status",LOG_SB16),0|128*!this.mpu_read_buffer.length},SB16.prototype.port3x1_write=function(e){dbg_log("331 write: mpu command: "+h(e),LOG_SB16),255==e&&(this.mpu_read_buffer.clear(),this.mpu_read_buffer.push(254))},SB16.prototype.command_do=function(){var e=DSP_COMMAND_HANDLERS[this.command];e||(e=this.dsp_default_handler),e.call(this),this.command=DSP_NO_COMMAND,this.command_size=0,
this.write_buffer.clear()},SB16.prototype.dsp_default_handler=function(){dbg_log("Unhandled command: "+h(this.command),LOG_SB16)},register_dsp_command([14],2,function(){this.asp_registers[this.write_buffer.shift()]=this.write_buffer.shift()}),register_dsp_command([15],1,function(){this.read_buffer.clear(),this.read_buffer.push(this.asp_registers[this.write_buffer.shift()])}),register_dsp_command([16],1,function(){var e=audio_normalize(this.write_buffer.shift(),127.5,-1);this.dac_buffers[0].push(e),this.dac_buffers[1].push(e),this.bus.send("speaker-update-enable",!0)}),register_dsp_command([20,21],2,function(){this.dma_irq=SB_IRQ_8BIT,this.dma_channel=this.dma_channel_8bit,this.dsp_highspeed=this.dsp_16bit=this.dsp_signed=this.dma_autoinit=!1,this.dma_transfer_size_set(),this.dma_transfer_start()}),register_dsp_command([22],2),register_dsp_command([23],2),register_dsp_command([28],0,function(){this.dma_irq=SB_IRQ_8BIT,this.dma_channel=this.dma_channel_8bit,this.dma_autoinit=!0,this.dsp_highspeed=this.dsp_16bit=this.dsp_signed=!1,this.dma_transfer_start()}),register_dsp_command([31],0),register_dsp_command([32],0,function(){this.read_buffer.clear(),this.read_buffer.push(127)}),register_dsp_command([36],2),register_dsp_command([44],0),register_dsp_command([48],0),register_dsp_command([49],0),register_dsp_command([52],0),register_dsp_command([53],0),register_dsp_command([54],0),register_dsp_command([55],0),register_dsp_command([56],0),register_dsp_command([64],1,function(){this.sampling_rate_change(1e6/(256-this.write_buffer.shift())/this.get_channel_count())}),register_dsp_command([65,66],2,function(){this.sampling_rate_change(this.write_buffer.shift()<<8|this.write_buffer.shift())}),register_dsp_command([72],2,function(){this.dma_transfer_size_set()}),register_dsp_command([116],2),register_dsp_command([117],2),register_dsp_command([118],2),register_dsp_command([119],2),register_dsp_command([125],0),register_dsp_command([127],0),register_dsp_command([128],2),register_dsp_command([144],0,function(){this.dma_irq=SB_IRQ_8BIT,this.dma_channel=this.dma_channel_8bit,this.dma_autoinit=!0,this.dsp_signed=!1,this.dsp_highspeed=!0,this.dsp_16bit=!1,this.dma_transfer_start()}),register_dsp_command([145],0),register_dsp_command([152],0),register_dsp_command([153],0),register_dsp_command([160],0),register_dsp_command([168],0),register_dsp_command(any_first_digit(176),3,function(){if(8&this.command)this.dsp_default_handler();else{var e=this.write_buffer.shift();this.dma_irq=SB_IRQ_16BIT,this.dma_channel=this.dma_channel_16bit,this.dma_autoinit=!!(4&this.command),this.dsp_signed=!!(16&e),this.dsp_stereo=!!(32&e),this.dsp_16bit=!0,this.dma_transfer_size_set(),this.dma_transfer_start()}}),register_dsp_command(any_first_digit(192),3,function(){if(8&this.command)this.dsp_default_handler();else{var e=this.write_buffer.shift();this.dma_irq=SB_IRQ_8BIT,this.dma_channel=this.dma_channel_8bit,this.dma_autoinit=!!(4&this.command),this.dsp_signed=!!(16&e),this.dsp_stereo=!!(32&e),this.dsp_16bit=!1,this.dma_transfer_size_set(),this.dma_transfer_start()}}),register_dsp_command([208],0,function(){this.dma_paused=!0,this.bus.send("speaker-update-enable",!1)}),register_dsp_command([209],0,function(){this.dummy_speaker_enabled=!0}),register_dsp_command([211],0,function(){this.dummy_speaker_enabled=!1}),register_dsp_command([212],0,function(){this.dma_paused=!1,this.bus.send("speaker-update-enable",!0)}),register_dsp_command([213],0,function(){this.dma_paused=!0,this.bus.send("speaker-update-enable",!1)}),register_dsp_command([214],0,function(){this.dma_paused=!1,this.bus.send("speaker-update-enable",!0)}),register_dsp_command([216],0,function(){this.read_buffer.clear(),this.read_buffer.push(255*this.dummy_speaker_enabled)}),register_dsp_command([217,218],0,function(){this.dma_autoinit=!1}),register_dsp_command([224],1,function(){this.read_buffer.clear(),this.read_buffer.push(~this.write_buffer.shift())}),register_dsp_command([225],0,function(){this.read_buffer.clear(),this.read_buffer.push(4),this.read_buffer.push(5)}),register_dsp_command([226],1),register_dsp_command([227],0,function(){this.read_buffer.clear();for(var e=0;e<DSP_COPYRIGHT.length;e++)this.read_buffer.push(DSP_COPYRIGHT.charCodeAt(e));this.read_buffer.push(0)}),register_dsp_command([228],1,function(){this.test_register=this.write_buffer.shift()}),register_dsp_command([232],0,function(){this.read_buffer.clear(),this.read_buffer.push(this.test_register)}),register_dsp_command([242,243],0,function(){this.raise_irq()});var SB_F9=new Uint8Array(256);SB_F9[14]=255,SB_F9[15]=7,SB_F9[55]=56,register_dsp_command([249],1,function(){var e=this.write_buffer.shift();dbg_log("dsp 0xf9: unknown function. input: "+e,LOG_SB16),this.read_buffer.clear(),this.read_buffer.push(SB_F9[e])}),SB16.prototype.mixer_default_read=function(){return dbg_log("unhandled mixer register read. addr:"+h(this.mixer_current_address),LOG_SB16),this.mixer_unhandled_registers[this.mixer_current_address]},SB16.prototype.mixer_default_write=function(e){dbg_log("unhandled mixer register write. addr:"+h(this.mixer_current_address)+" data:"+h(e),LOG_SB16),this.mixer_unhandled_registers[this.mixer_current_address]=e},register_mixer_read(0,function(){return 0}),register_mixer_write(0),register_mixer_write(14,function(e){this.dsp_stereo=2&e,this.bus.send("speaker-stereo",this.dsp_stereo),this.bus.send("speaker-filter",32&e)}),register_mixer_read(128,function(){switch(this.irq){case SB_IRQ2:return 1;case SB_IRQ5:return 2;case SB_IRQ7:return 4;case SB_IRQ10:return 8;default:return 0}}),register_mixer_write(128,function(e){1&e&&(this.irq=SB_IRQ2),2&e&&(this.irq=SB_IRQ5),4&e&&(this.irq=SB_IRQ7),8&e&&(this.irq=SB_IRQ10)}),register_mixer_read(129,function(){var e=0;switch(this.dma_channel_8bit){case SB_DMA0:e|=1;break;case SB_DMA1:e|=2;break;case SB_DMA3:e|=8}switch(this.dma_channel_16bit){case SB_DMA5:e|=32;break;case SB_DMA6:e|=64;break;case SB_DMA7:e|=128}return e}),register_mixer_write(129,function(e){1&e&&(this.dma_channel_8bit=SB_DMA0),2&e&&(this.dma_channel_8bit=SB_DMA1),8&e&&(this.dma_channel_8bit=SB_DMA3),32&e&&(this.dma_channel_16bit=SB_DMA5),64&e&&(this.dma_channel_16bit=SB_DMA6),128&e&&(this.dma_channel_16bit=SB_DMA7)}),register_mixer_read(130,function(){for(var e=32,t=0;16>t;t++)e|=t*this.irq_triggered[t];return e}),SB16.prototype.fm_default_write=function(e,t,s){dbg_log("unhandled fm register write. addr:"+t+"|"+h(s)+" data:"+h(e),LOG_SB16)};var SB_FM_OPERATORS_BY_OFFSET=new Uint8Array(32);SB_FM_OPERATORS_BY_OFFSET[0]=0,SB_FM_OPERATORS_BY_OFFSET[1]=1,SB_FM_OPERATORS_BY_OFFSET[2]=2,SB_FM_OPERATORS_BY_OFFSET[3]=3,SB_FM_OPERATORS_BY_OFFSET[4]=4,SB_FM_OPERATORS_BY_OFFSET[5]=5,SB_FM_OPERATORS_BY_OFFSET[8]=6,SB_FM_OPERATORS_BY_OFFSET[9]=7,SB_FM_OPERATORS_BY_OFFSET[10]=8,SB_FM_OPERATORS_BY_OFFSET[11]=9,SB_FM_OPERATORS_BY_OFFSET[12]=10,SB_FM_OPERATORS_BY_OFFSET[13]=11,SB_FM_OPERATORS_BY_OFFSET[16]=12,SB_FM_OPERATORS_BY_OFFSET[17]=13,SB_FM_OPERATORS_BY_OFFSET[18]=14,SB_FM_OPERATORS_BY_OFFSET[19]=15,SB_FM_OPERATORS_BY_OFFSET[20]=16,SB_FM_OPERATORS_BY_OFFSET[21]=17,register_fm_write([1],function(e,t,s){this.fm_waveform_select_enable[t]=1&e,this.fm_update_waveforms()}),register_fm_write([2]),register_fm_write([3]),register_fm_write([4],function(e,t,s){}),register_fm_write([5],function(e,t,s){0===t&&this.fm_default_write(e,t,s)}),register_fm_write([8],function(e,t,s){}),register_fm_write(between(32,53),function(e,t,s){get_fm_operator(t,s-32)}),register_fm_write(between(64,85),function(e,t,s){get_fm_operator(t,s-64)}),register_fm_write(between(96,117),function(e,t,s){get_fm_operator(t,s-96)}),register_fm_write(between(128,149),function(e,t,s){get_fm_operator(t,s-128)}),register_fm_write(between(160,168),function(e,t,s){}),register_fm_write(between(176,184),function(e,t,s){}),register_fm_write([189],function(e,t,s){}),register_fm_write(between(192,200),function(e,t,s){}),register_fm_write(between(224,245),function(e,t,s){get_fm_operator(t,s-224)}),SB16.prototype.fm_update_waveforms=function(){},SB16.prototype.sampling_rate_change=function(e){this.sampling_rate=e},SB16.prototype.get_channel_count=function(){return this.dsp_stereo?2:1},SB16.prototype.dma_transfer_size_set=function(){this.dma_sample_count=1+(this.write_buffer.shift()<<0)+(this.write_buffer.shift()<<8)},SB16.prototype.dma_transfer_start=function(){dbg_log("begin dma transfer",LOG_SB16),this.bytes_per_sample=1,this.dsp_16bit&&(this.bytes_per_sample*=2),this.dac_rate_ratio=Math.round(this.audio_samplerate/this.sampling_rate),this.dma_bytes_count=this.dma_sample_count*this.bytes_per_sample,this.dma_bytes_block=SB_DMA_BLOCK_SAMPLES*this.bytes_per_sample,this.dma_waiting_transfer=!0},SB16.prototype.dma_on_unmask=function(e){e===this.dma_channel&&this.dma_waiting_transfer&&(this.dma_waiting_transfer=!1,this.dma_bytes_left=this.dma_bytes_count,this.dma_paused=!1,this.bus.send("speaker-update-enable",!0),this.dma_transfer_next())},SB16.prototype.dma_transfer_next=function(){var e=this;if(this.dma_bytes_left&&!(this.dac_buffers[0].length>2*this.dac_process_samples||this.cpu_paused||this.dma_paused)){dbg_log("dma transfering next block",LOG_SB16);var t=Math.min(this.dma_bytes_left,this.dma_bytes_block),s=Math.floor(t/this.bytes_per_sample);this.dma.do_write(this.dma_syncbuffer,0,t,this.dma_channel,function(r){dbg_log("dma block transfer "+(r?"unsuccessful":"successful"),LOG_SB16),r||(e.dma_to_dac(s),e.dma_bytes_left-=t,e.dma_bytes_left||(e.raise_irq(e.dma_irq),e.dma_autoinit&&(e.dma_bytes_left=e.dma_bytes_count)),setTimeout(function(){e.dma_transfer_next()},0))})}},SB16.prototype.dma_to_dac=function(e){for(var t=this.dsp_16bit?32767.5:127.5,s=this.dsp_signed?0:-1,r=(this.dsp_stereo?1:2)*this.dac_rate_ratio,i=this.dsp_16bit?this.dsp_signed?this.dma_buffer_int16:this.dma_buffer_uint16:this.dsp_signed?this.dma_buffer_int8:this.dma_buffer_uint8,_=0,a=0;a<e;a++)for(var o=audio_normalize(i[a],t,s),n=0;n<r;n++)this.dac_buffers[_].push(o),_^=1},SB16.prototype.audio_send=function(e){var t=this;this.dac_process_samples=e,this.dac_buffers[0].length&&this.dac_buffers[0].length<2*this.dac_process_samples&&dbg_log("dac_buffer contains only "+this.dac_buffers[0].length/2+" samples out of "+this.dac_process_samples+" needed",LOG_SB16);var s=this.dac_buffers[0].shift_block(e);e=this.dac_buffers[1].shift_block(e),this.bus.send("speaker-update-data",[s,e],[s.buffer,e.buffer]),setTimeout(function(){t.dma_transfer_next()},0)},SB16.prototype.raise_irq=function(e){dbg_log("raise irq",LOG_SB16),this.irq_triggered[e]=1,this.cpu.device_raise_irq(this.irq)},SB16.prototype.lower_irq=function(e){dbg_log("lower irq",LOG_SB16),this.irq_triggered[e]=0,this.cpu.device_lower_irq(this.irq)},VirtIO.prototype.get_state=function(){var e=[0];return e[1]=this.queue_select,e[2]=this.device_status,e[3]=this.isr,e[4]=this.last_idx,e[5]=this.queue_size,e[6]=this.queue_address,e[7]=this.device,e},VirtIO.prototype.set_state=function(e){this.queue_select=e[1],this.device_status=e[2],this.isr=e[3],this.last_idx=e[4],this.queue_size=e[5],this.queue_address=e[6],this.device=e[7],this.device.SendReply=this.device_reply.bind(this)},VirtIO.prototype.reset=function(){this.last_idx=this.isr=this.device_status=this.queue_select=0,this.queue_size=32,this.queue_address=0},VirtIO.prototype.handle_descriptor=function(e){for(var t=e,s=this.queue_address<<12,r=0,i=[];;){var _=s+16*t,a=this.cpu.read16(_+12);if(a&VRING_DESC_F_WRITE)break;a&VRING_DESC_F_INDIRECT&&dbg_assert(!1,"unsupported");var o=this.cpu.read32s(_),n=this.cpu.read32s(_+4),d=this.cpu.read32s(_+8)>>>0;if(i.push({addr_low:o,addr_high:n,len:d}),dbg_log("descriptor: addr="+h(n,8)+":"+h(o,8)+" len="+h(d,8)+" flags="+h(a,4)+" next="+h(t,4),LOG_VIRTIO),!(a&VRING_DESC_F_NEXT)){t=-1;break}t=this.cpu.read16(_+14),dbg_assert(t<this.queue_size)}var g=-1,c=0;this.device.ReceiveRequest({start:e,next:t},function(){if(c>=g){if(r===i.length)return dbg_log("Read more data than descriptor has",LOG_VIRTIO),0;var e=i[r++];o=e.addr_low,g=e.len,c=0}return this.cpu.read8(o+c++)}.bind(this))},VirtIO.prototype.device_reply=function(e,t){if(-1===t.next)dbg_log("Reply to invalid index",LOG_VIRTIO);else{var s=this.queue_size-1;e=this.device.replybuffersize;for(var r=t.next,i=this.queue_address<<12,_=0,a=[];;){var o=i+16*r,n=this.cpu.read16(o+12);if(0==(n&VRING_DESC_F_WRITE)){dbg_log("Bug: Readonly ring after writeonly ring",LOG_VIRTIO);break}var d=this.cpu.read32s(o),g=this.cpu.read32s(o+4),c=this.cpu.read32s(o+8)>>>0;if(a.push({addr_low:d,addr_high:g,len:c}),dbg_log("descriptor: addr="+h(g,8)+":"+h(d,8)+" len="+h(c,8)+" flags="+h(n,4)+" next="+h(r,4),LOG_VIRTIO),!(n&VRING_DESC_F_NEXT))break;r=this.cpu.read16(o+14),dbg_assert(r<this.queue_size)}for(i=-1,n=o=0;n<e;n++){if(r=this.device.replybuffer[n],o>=i){if(_===a.length)return dbg_log("Write more data than descriptor has",LOG_VIRTIO),0;i=a[_++],d=i.addr_low,i=i.len,o=0}this.cpu.write8(d+o++,r)}d=(this.queue_address<<12)+16*this.queue_size+4+2*this.queue_size,d=d+4095&-4096,n=this.cpu.read16(d),_=this.cpu.read16(d+2),this.cpu.write16(d+2,_+1),dbg_log("used descriptor: addr="+h(d,8)+" flags="+h(n,4)+" idx="+h(_,4),LOG_VIRTIO),s=d+4+8*(_&s),this.cpu.write32(s,t.start),this.cpu.write32(s+4,e),this.isr|=1,this.pci.raise_irq(this.pci_id)}};var Bus={};BusConnector.prototype.register=function(e,t,s){var r=this.listeners[e];void 0===r&&(r=this.listeners[e]=[]),r.push({fn:t,this_value:s})},BusConnector.prototype.unregister=function(e,t){var s=this.listeners[e];void 0!==s&&(this.listeners[e]=s.filter(function(e){return e.fn!==t}))},BusConnector.prototype.send=function(e,t,s){if(this.pair&&void 0!==(e=this.pair.listeners[e]))for(s=0;s<e.length;s++){var r=e[s];r.fn.call(r.this_value,t)}},BusConnector.prototype.send_async=function(e,t){dbg_assert(1===arguments.length||2===arguments.length),setTimeout(this.send.bind(this,e,t),0)},Bus.create=function(){var e=new BusConnector,t=new BusConnector;return e.pair=t,t.pair=e,[e,t]};var log_data=[],dbg_log=function(){if(!DEBUG)return function(){};var e=LOG_NAMES.reduce(function(e,t){return e[t[0]]=t[1],e},{}),t="",s=0;return function(r,i){if(DEBUG&&(i=i||1)&LOG_LEVEL){if((r="["+v86util.pads(e[i]||"",4)+"] "+r)===t&&2048>++s)return;i=new Date,i=v86util.pad0(i.getHours(),2)+":"+v86util.pad0(i.getMinutes(),2)+":"+v86util.pad0(i.getSeconds(),2)+"+"+v86util.pad0(i.getMilliseconds(),3)+" ",s&&(do_the_log(1===s?i+t:"Previous message repeated "+s+" times"),s=0),do_the_log(i+r),t=r}}}(),instruction_count,instruction_total,CPU_LOG_VERBOSE=!0;CPU.prototype.get_state=function(){var e=[];return e[0]=this.memory_size,e[1]=this.segment_is_null,e[2]=this.segment_offsets,e[3]=this.segment_limits,e[4]=this.protected_mode,e[5]=this.idtr_offset,e[6]=this.idtr_size,e[7]=this.gdtr_offset,e[8]=this.gdtr_size,e[9]=this.page_fault,e[10]=this.cr,e[11]=this.cpl,e[12]=this.page_size_extensions,e[13]=this.is_32,e[16]=this.stack_size_32,e[17]=this.in_hlt,e[18]=this.last_virt_eip,e[19]=this.eip_phys,e[20]=this.last_virt_esp,e[21]=this.esp_phys,e[22]=this.sysenter_cs,e[23]=this.sysenter_eip,e[24]=this.sysenter_esp,e[25]=this.prefixes,e[26]=this.flags,e[27]=this.flags_changed,e[28]=this.last_op1,e[29]=this.last_op2,e[30]=this.last_op_size,e[31]=this.last_add_result,e[32]=this.modrm_byte,e[36]=this.paging,e[37]=this.instruction_pointer,e[38]=this.previous_ip,e[39]=this.reg32s,e[40]=this.sreg,e[41]=this.dreg,e[42]=this.mem8,e[43]=this.fpu,e[45]=this.devices.virtio,e[46]=this.devices.apic,e[47]=this.devices.rtc,e[48]=this.devices.pci,e[49]=this.devices.dma,e[50]=this.devices.acpi,e[51]=this.devices.hpet,e[52]=this.devices.vga,e[53]=this.devices.ps2,e[54]=this.devices.uart,e[55]=this.devices.fdc,e[56]=this.devices.cdrom,e[57]=this.devices.hda,e[58]=this.devices.pit,e[59]=this.devices.net,e[60]=this.devices.pic,e[61]=this.devices.sb16,e[62]=this.a20_enabled,e[63]=this.fw_value,e[64]=this.devices.ioapic,e[65]=this.tss_size_32,e[66]=this.reg_mmxs,e},CPU.prototype.set_state=function(e){this.memory_size=e[0],this.segment_is_null=e[1],this.segment_offsets=e[2],this.segment_limits=e[3],this.protected_mode=e[4],this.idtr_offset=e[5],this.idtr_size=e[6],this.gdtr_offset=e[7],this.gdtr_size=e[8],this.page_fault=e[9],this.cr=e[10],this.cpl=e[11],this.page_size_extensions=e[12],this.is_32=e[13],this.stack_size_32=e[16],this.in_hlt=e[17],this.last_virt_eip=e[18],this.eip_phys=e[19],this.last_virt_esp=e[20],this.esp_phys=e[21],this.sysenter_cs=e[22],this.sysenter_eip=e[23],this.sysenter_esp=e[24],this.prefixes=e[25],this.flags=e[26],this.flags_changed=e[27],this.last_op1=e[28],this.last_op2=e[29],this.last_op_size=e[30],this.last_add_result=e[31],this.modrm_byte=e[32],this.paging=e[36],this.instruction_pointer=e[37],this.previous_ip=e[38],this.reg32s=e[39],this.sreg=e[40],this.dreg=e[41],this.mem8=e[42],this.fpu=e[43],this.devices.virtio=e[45],this.devices.apic=e[46],this.devices.rtc=e[47],this.devices.pci=e[48],this.devices.dma=e[49],this.devices.acpi=e[50],this.devices.hpet=e[51],this.devices.vga=e[52],this.devices.ps2=e[53],this.devices.uart=e[54],this.devices.fdc=e[55],this.devices.cdrom=e[56],this.devices.hda=e[57],this.devices.pit=e[58],this.devices.net=e[59],this.devices.pic=e[60],this.devices.sb16=e[61],this.a20_enabled=e[62],this.fw_value=e[63],this.devices.ioapic=e[64],this.tss_size_32=e[65],this.reg_mmxs=e[66],this.mem16=new Uint16Array(this.mem8.buffer,this.mem8.byteOffset,this.mem8.length>>1),this.mem32s=new Int32Array(this.mem8.buffer,this.mem8.byteOffset,this.mem8.length>>2),this.full_clear_tlb(),this.reg32=new Uint32Array(this.reg32s.buffer),this.reg16s=new Int16Array(this.reg32s.buffer),this.reg16=new Uint16Array(this.reg32s.buffer),this.reg8s=new Int8Array(this.reg32s.buffer),this.reg8=new Uint8Array(this.reg32s.buffer),this.reg_mmx=new Uint32Array(this.reg_mmxs.buffer),this.reg_mmx8s=new Int8Array(this.reg_mmxs.buffer),this.reg_mmx8=new Uint8Array(this.reg_mmxs.buffer),this.update_operand_size()},CPU.prototype.main_run=function(){if(this.in_hlt){var e=this.hlt_loop();if(this.in_hlt)return e}return this.do_run(),0},CPU.prototype.exception_cleanup=function(e){if(e!==MAGIC_CPU_EXCEPTION)throw console.log(e),console.log(e.stack),e;this.page_fault=!1,this.clear_prefixes()},CPU.prototype.reboot_internal=function(){throw this.reset(),this.load_bios(),MAGIC_CPU_EXCEPTION},CPU.prototype.reset=function(){this.a20_enabled=!0;for(var e=0;8>e;e++)this.segment_is_null[e]=0,this.segment_limits[e]=0,this.segment_offsets[e]=0;for(this.full_clear_tlb(),e=0;8>e;e++)this.reg32s[e]=0,this.sreg[e]=0,this.cr[e]=0,this.dreg[e]=0;for(e=0;e<this.reg_mmxs.length;e++)this.reg_mmxs[e]=0;for(e=0;e<this.reg_xmm32s.length;e++)this.reg_xmm32s[e]=0;this.mxcsr=8064,this.protected_mode=!1,this.gdtr_offset=this.gdtr_size=this.idtr_offset=this.idtr_size=0,this.page_fault=!1,this.cr[0]=1610612752,this.cr[2]=0,this.cr[3]=0,this.cr[4]=0,this.dreg[6]=-61456,this.dreg[7]=1024,this.cpl=0,this.paging=!1,this.page_size_extensions=0,this.stack_size_32=this.is_32=!1,this.prefixes=0,this.last_virt_esp=this.last_virt_eip=-1,this.update_operand_size(),this.previous_ip=this.timestamp_counter=0,this.in_hlt=!1,this.sysenter_eip=this.sysenter_esp=this.sysenter_cs=0,this.flags=flags_default,this.last_op_size=this.last_op2=this.last_op1=this.last_add_result=this.last_result=this.flags_changed=0,this.tsc_offset=v86.microtick(),this.instruction_pointer=1048560,this.switch_cs_real_mode(61440),this.switch_seg(reg_ss,48),this.reg16[reg_sp]=256,this.devices.virtio&&this.devices.virtio.reset(),this.fw_value=0},CPU.prototype.create_memory=function(e){1048576>e?e=1048576:0>(0|e)&&(e=Math.pow(2,31)-MMAP_BLOCK_SIZE),e=1+(e-1|MMAP_BLOCK_SIZE-1)|0,dbg_assert(0<(0|e)),dbg_assert(0==(e&MMAP_BLOCK_SIZE-1)),this.memory_size=e,e=new ArrayBuffer(e),this.mem8=new Uint8Array(e),this.mem16=new Uint16Array(e),this.mem32s=new Int32Array(e)},goog.exportProperty(CPU.prototype,"create_memory",CPU.prototype.create_memory),CPU.prototype.init=function(e,t){this.create_memory("number"==typeof e.memory_size?e.memory_size:67108864),this.reset();var s=new IO(this);this.io=s,this.bios.main=e.bios,this.bios.vga=e.vga_bios,this.load_bios();var r=0;s.register_read(179,this,function(){return dbg_log("port 0xB3 read"),0}),s.register_read(146,this,function(){return r}),s.register_write(146,this,function(e){r=e}),s.register_read(1297,this,function(){var e=255&this.fw_value;return this.fw_value>>>=8,e}),s.register_write(1296,this,void 0,function(e){dbg_log("bios config port, index="+h(e)),e===FW_CFG_SIGNATURE?this.fw_value=-89064784:e===FW_CFG_RAM_SIZE?this.fw_value=this.memory_size:e===FW_CFG_NB_CPUS?this.fw_value=1:(dbg_assert(!1,"Unimplemented fw index: "+h(e)),this.fw_value=0)}),DEBUG&&s.register_write(128,this,function(e){}),this.devices={},e.load_devices&&(this.devices.pic=new PIC(this),this.devices.pci=new PCI(this),ENABLE_ACPI&&(this.devices.ioapic=new IOAPIC(this),this.devices.apic=new APIC(this),this.devices.acpi=new ACPI(this)),this.devices.rtc=new RTC(this),this.fill_cmos(this.devices.rtc,e),this.devices.dma=new DMA(this),ENABLE_HPET&&(this.devices.hpet=new HPET(this)),this.devices.vga=new VGAScreen(this,t,e.vga_memory_size||8388608),this.fpu=new FPU(this),this.devices.ps2=new PS2(this,t),this.devices.uart=new UART(this,1016,t),this.devices.fdc=new FloppyController(this,e.fda,e.fdb),s=0,e.hda&&(this.devices.hda=new IDEDevice(this,e.hda,!1,s++,t)),e.cdrom&&(this.devices.cdrom=new IDEDevice(this,e.cdrom,!0,s++,t)),e.hdb&&(this.devices.hdb=new IDEDevice(this,e.hdb,!1,s++,t)),this.devices.pit=new PIT(this,t),e.enable_ne2k&&(this.devices.net=new Ne2k(this,t)),e.fs9p&&(this.devices.virtio=new VirtIO(this,t,e.fs9p)),this.devices.sb16=new SB16(this,t)),e.multiboot&&(dbg_assert(e.multiboot.buffer),this.load_multiboot(e.multiboot.buffer)),DEBUG&&this.debug.init()},CPU.prototype.load_multiboot=function(e){if(dbg_log("Trying multiboot from buffer of size "+e.byteLength,LOG_CPU),8192>e.byteLength){var t=new Int32Array(2048);new Uint8Array(t.buffer).set(new Uint8Array(e))}else t=new Int32Array(e,0,2048);for(var s=0;8192>s;s+=4)if(464367618===t[s>>2]){var r=t[s+4>>2];if(!(464367618+r+t[s+8>>2]|0)){dbg_log("Multiboot magic found, flags: "+h(r>>>0,8),LOG_CPU),dbg_assert(0==(-65537&r),"TODO"),this.reg32s[reg_eax]=732803074,this.reg32s[reg_ebx]=31744,this.write32(31744,0),this.cr[0]=1,this.protected_mode=!0,this.flags=flags_default,this.update_cs_size(!0),this.stack_size_32=!0;for(var i=0;6>i;i++)this.segment_is_null[i]=0,this.segment_offsets[i]=0,this.segment_limits[i]=4294967295,this.sreg[i]=45058;if(65536&r){dbg_log("Multiboot specifies its own address table",LOG_CPU);var _=t[s+12>>2];r=t[s+16>>2],i=t[s+20>>2];var a=t[s+24>>2];t=t[s+28>>2],dbg_log("header="+h(_,8)+" load="+h(r,8)+" load_end="+h(i,8)+" bss_end="+h(a,8)+" entry="+h(t,8)),dbg_assert(r<=_),s-=_-r,0===i?i=void 0:(dbg_assert(i>=r),i-=r),e=new Uint8Array(e,s,i),this.write_blob(e,r),this.instruction_pointer=this.get_seg(reg_cs)+t|0}else if(1179403647===t[0])for(dbg_log("Multiboot image is in elf format",LOG_CPU),r=read_elf(e),this.instruction_pointer=this.get_seg(reg_cs)+r.header.entry|0,r=$jscomp.makeIterator(r.program_headers),s=r.next();!s.done;s=r.next())s=s.value,0!==s.type&&(1===s.type?(dbg_assert(s.paddr===s.vaddr),dbg_assert(s.filesz<=s.memsz),t=new Uint8Array(e,s.offset,s.filesz),this.write_blob(t,s.paddr)):4!==s.type&&1685382480!==s.type&&1685382481!==s.type&&dbg_assert(!1,"unimplemented elf section type"));else dbg_assert(!1,"Not a bootable multiboot format");for(this.io.register_write_consecutive(244,this,function(e){throw console.log("Test exited with code "+h(e,2)),"HALT"},function(){},function(){},function(){}),e={i$10:14};15>=e.i$10;e={i$10:e.i$10},e.i$10++)this.io.register_write(8192+e.i$10,this,function(e){return function(t){dbg_log("kvm-unit-test: Set irq "+h(e.i$10)+" to "+h(t,2)),t?this.device_raise_irq(e.i$10):this.device_lower_irq(e.i$10)}}(e));dbg_log("Starting multiboot kernel at:",LOG_CPU),this.debug.dump_state(),this.debug.dump_regs();break}dbg_log("Multiboot checksum check failed",LOG_CPU)}},CPU.prototype.fill_cmos=function(e,t){var s=t.boot_order||531;e.cmos_write(CMOS_BIOS_BOOTFLAG1,1|s>>4&240),e.cmos_write(CMOS_BIOS_BOOTFLAG2,255&s),e.cmos_write(CMOS_MEM_BASE_LOW,128),e.cmos_write(CMOS_MEM_BASE_HIGH,2),s=0,1048576<=this.memory_size&&(s=this.memory_size-1048576>>10,s=Math.min(s,65535)),e.cmos_write(CMOS_MEM_OLD_EXT_LOW,255&s),e.cmos_write(CMOS_MEM_OLD_EXT_HIGH,s>>8&255),e.cmos_write(CMOS_MEM_EXTMEM_LOW,255&s),e.cmos_write(CMOS_MEM_EXTMEM_HIGH,s>>8&255),s=0,16777216<=this.memory_size&&(s=this.memory_size-16777216>>16,s=Math.min(s,65535)),e.cmos_write(CMOS_MEM_EXTMEM2_LOW,255&s),e.cmos_write(CMOS_MEM_EXTMEM2_HIGH,s>>8&255),e.cmos_write(CMOS_MEM_HIGHMEM_LOW,0),e.cmos_write(CMOS_MEM_HIGHMEM_MID,0),e.cmos_write(CMOS_MEM_HIGHMEM_HIGH,0),e.cmos_write(CMOS_EQUIPMENT_INFO,47),e.cmos_write(CMOS_BIOS_SMP_COUNT,0),t.fastboot&&e.cmos_write(63,1)},CPU.prototype.load_bios=function(){var e=this.bios.main,t=this.bios.vga;if(e){var s=new Uint8Array(e);if(this.write_blob(s,1048576-e.byteLength),t){var r=new Uint8Array(t);this.write_blob(r,786432),this.io.mmap_register(4272947200,1048576,function(e){return e=e-4272947200|0,e<r.length?r[e]:0},function(e,t){dbg_assert(!1,"Unexpected write to VGA rom")})}else dbg_log("Warning: No VGA BIOS");this.io.mmap_register(4293918720,1048576,function(e){return this.mem8[1048575&e]}.bind(this),function(e,t){this.mem8[1048575&e]=t}.bind(this))}else dbg_log("Warning: No BIOS")},CPU.prototype.do_run=function(){for(var e=v86.microtick(),t=e;t-e<TIME_PER_FRAME&&(this.run_hardware_timers(t),this.handle_irqs(),this.do_many_cycles(),!this.in_hlt);)t=v86.microtick()},CPU.prototype.do_many_cycles=function(){try{this.do_many_cycles_unsafe()}catch(e){this.exception_cleanup(e)}},CPU.prototype.do_many_cycles_unsafe=function(){for(var e=LOOP_COUNTER;e--;)this.cycle_internal()},"undefined"!=typeof window&&(window.__no_inline_for_closure_compiler__=[CPU.prototype.exception_cleanup,CPU.prototype.do_many_cycles_unsafe,CPU.prototype.do_many_cycles]);var PROFILING=!1;CPU.prototype.cycle_internal=function(){if(this.previous_ip=this.instruction_pointer,this.timestamp_counter++,PROFILING)var e=performance.now();var t=this.read_imm8();if(DEBUG&&this.debug.logop(this.instruction_pointer-1>>>0,t),this.table[t](this),PROFILING){var s=performance.now();instruction_total[t]+=s-e,instruction_count[t]++}this.flags&flag_trap&&dbg_log("Trap flag: Ignored",LOG_CPU)},CPU.prototype.cycle=function(){try{this.cycle_internal()}catch(e){this.exception_cleanup(e)}},goog.exportProperty(CPU.prototype,"cycle",CPU.prototype.cycle),CPU.prototype.segment_prefix_op=function(e){dbg_assert(5>=e),this.prefixes|=e+1,this.run_prefix_instruction(),this.prefixes=0},CPU.prototype.run_prefix_instruction=function(){this.is_osize_32()?this.table32[this.read_imm8()](this):this.table16[this.read_imm8()](this)},CPU.prototype.hlt_loop=function(){return dbg_assert(this.flags&flag_interrupt),this.run_hardware_timers(v86.microtick()),this.handle_irqs(),0},CPU.prototype.run_hardware_timers=function(e){ENABLE_HPET?(this.devices.pit.timer(e,this.devices.hpet.legacy_mode),this.devices.rtc.timer(e,this.devices.hpet.legacy_mode),this.devices.hpet.timer(e)):(this.devices.pit.timer(e,!1),this.devices.rtc.timer(e,!1)),ENABLE_ACPI&&(this.devices.acpi.timer(e),this.devices.apic.timer(e))},CPU.prototype.clear_prefixes=function(){this.prefixes=0},CPU.prototype.set_cr0=function(e){if((e&(CR0_PE|CR0_PG))===CR0_PG)throw this.debug.unimpl("#GP handler");this.cr[0]=e,this.fpu||(this.cr[0]|=CR0_EM),this.cr[0]|=CR0_ET,e=(this.cr[0]&CR0_PG)===CR0_PG,dbg_assert("boolean"==typeof this.paging),e!==this.paging&&(this.paging=e,this.full_clear_tlb()),this.protected_mode=(this.cr[0]&CR0_PE)===CR0_PE},CPU.prototype.set_cr4=function(e){if(-3565568&e&&this.trigger_gp(0),(this.cr[4]^e)&CR4_PGE&&(e&CR4_PGE?this.clear_tlb():this.full_clear_tlb()),this.cr[4]=e,this.page_size_extensions=e&CR4_PSE?PSE_ENABLED:0,e&CR4_PAE)throw this.debug.unimpl("PAE");4294965504&e&&(dbg_assert(!1,"Unimplemented CR4 bits: "+h(e)),this.trigger_ud()),dbg_log("cr4="+h(e>>>0),LOG_CPU)},CPU.prototype.cpl_changed=function(){this.last_virt_esp=this.last_virt_eip=-1},CPU.prototype.read_imm8=function(){-4096&this.instruction_pointer^this.last_virt_eip&&(this.eip_phys=this.translate_address_read(this.instruction_pointer)^this.instruction_pointer,this.last_virt_eip=-4096&this.instruction_pointer);var e=this.read8(this.eip_phys^this.instruction_pointer);return this.instruction_pointer=this.instruction_pointer+1|0,e},CPU.prototype.read_imm8s=function(){return this.read_imm8()<<24>>24},CPU.prototype.read_imm16=function(){if(4094<(this.instruction_pointer^this.last_virt_eip)>>>0)return this.read_imm8()|this.read_imm8()<<8;var e=this.read16(this.eip_phys^this.instruction_pointer);return this.instruction_pointer=this.instruction_pointer+2|0,e},CPU.prototype.read_imm32s=function(){if(4092<(this.instruction_pointer^this.last_virt_eip)>>>0)return this.read_imm16()|this.read_imm16()<<16;var e=this.read32s(this.eip_phys^this.instruction_pointer);return this.instruction_pointer=this.instruction_pointer+4|0,e},CPU.prototype.create_atom64s=function(e,t){var s=new Int32Array(2);return s[0]=e,s[1]=t,s},CPU.prototype.create_atom128s=function(e,t,s,r){var i=new Int32Array(4);return i[0]=e,i[1]=t,i[2]=s,i[3]=r,i},CPU.prototype.read_modrm_byte=function(){this.modrm_byte=this.read_imm8()},CPU.prototype.read_op0F=CPU.prototype.read_imm8,CPU.prototype.read_sib=CPU.prototype.read_imm8,CPU.prototype.read_op8=CPU.prototype.read_imm8,CPU.prototype.read_op8s=CPU.prototype.read_imm8s,CPU.prototype.read_op16=CPU.prototype.read_imm16,CPU.prototype.read_op32s=CPU.prototype.read_imm32s,CPU.prototype.read_disp8=CPU.prototype.read_imm8,CPU.prototype.read_disp8s=CPU.prototype.read_imm8s,CPU.prototype.read_disp16=CPU.prototype.read_imm16,CPU.prototype.read_disp32s=CPU.prototype.read_imm32s,CPU.prototype.init2=function(){},CPU.prototype.branch_taken=function(){},CPU.prototype.branch_not_taken=function(){},CPU.prototype.diverged=function(){},CPU.prototype.modrm_resolve=function(e){return dbg_assert(192>e),(this.is_asize_32()?this.modrm_table32:this.modrm_table16)[e](this)},CPU.prototype.sib_resolve=function(e){return this.sib_table[this.read_sib()](this,e)},CPU.prototype.clear_instruction_cache=function(){},CPU.prototype.virt_boundary_read16=function(e,t){return dbg_assert(4095==(4095&e)),dbg_assert(0==(4095&t)),this.read8(e)|this.read8(t)<<8},CPU.prototype.virt_boundary_read32s=function(e,t){dbg_assert(4093<=(4095&e)),dbg_assert((t-3&4095)==(4095&e));var s=1&e?2&e?this.read_aligned16(t-2>>1):this.read_aligned16(e+1>>1):this.virt_boundary_read16(e+1|0,t-1|0);return this.read8(e)|s<<8|this.read8(t)<<24},CPU.prototype.virt_boundary_write16=function(e,t,s){dbg_assert(4095==(4095&e)),dbg_assert(0==(4095&t)),this.write8(e,s),this.write8(t,s>>8)},CPU.prototype.virt_boundary_write32=function(e,t,s){dbg_assert(4093<=(4095&e)),dbg_assert((t-3&4095)==(4095&e)),this.write8(e,s),this.write8(t,s>>24),1&e?2&e?(this.write8(t-2,s>>8),this.write8(t-1,s>>16)):(this.write8(e+1|0,s>>8),this.write8(e+2|0,s>>16)):(this.write8(e+1|0,s>>8),this.write8(t-1,s>>16))},CPU.prototype.safe_read8=function(e){return dbg_assert(2147483648>e),this.read8(this.translate_address_read(e))},CPU.prototype.safe_read16=function(e){return this.paging&&4095==(4095&e)?this.safe_read8(e)|this.safe_read8(e+1|0)<<8:this.read16(this.translate_address_read(e))},CPU.prototype.safe_read32s=function(e){return this.paging&&4093<=(4095&e)?this.safe_read16(e)|this.safe_read16(e+2|0)<<16:this.read32s(this.translate_address_read(e))},CPU.prototype.safe_read64s=function(e){var t=this.create_atom64s(0,0);return this.paging&&4089<=(4095&e)?(t[0]=this.safe_read32s(e),t[1]=this.safe_read32s(e+4|0)):(t[0]=this.read32s(this.translate_address_read(e)),t[1]=this.read32s(this.translate_address_read(e+4|0))),t},CPU.prototype.safe_read128s_aligned=function(e){return dbg_assert(0==(15&e)),e=this.translate_address_read(e),
this.create_atom128s(this.read32s(e),this.read32s(e+4|0),this.read32s(e+8|0),this.read32s(e+12|0))},CPU.prototype.safe_read128s_unaligned=function(e){return this.create_atom128s(this.safe_read32s(e),this.safe_read32s(e+4|0),this.safe_read32s(e+8|0),this.safe_read32s(e+12|0))},CPU.prototype.safe_write8=function(e,t){dbg_assert(2147483648>e),this.write8(this.translate_address_write(e),t)},CPU.prototype.safe_write16=function(e,t){var s=this.translate_address_write(e);4095==(4095&e)?this.virt_boundary_write16(s,this.translate_address_write(e+1|0),t):this.write16(s,t)},CPU.prototype.safe_write32=function(e,t){var s=this.translate_address_write(e);4093<=(4095&e)?this.virt_boundary_write32(s,this.translate_address_write(e+3&-4)|e+3&3,t):this.write32(s,t)},CPU.prototype.safe_write64=function(e,t,s){this.writable_or_pagefault(e,8),this.safe_write32(e,t),this.safe_write32(e+4|0,s)},CPU.prototype.safe_write128=function(e,t,s,r,i){this.writable_or_pagefault(e,16),this.safe_write32(e,t),this.safe_write32(e+4|0,s),this.safe_write32(e+8|0,r),this.safe_write32(e+12|0,i)},CPU.prototype.read_moffs=function(){return this.is_asize_32()?this.get_seg_prefix(reg_ds)+this.read_op32s()|0:this.get_seg_prefix(reg_ds)+this.read_op16()|0},CPU.prototype.getiopl=function(){return this.flags>>12&3},CPU.prototype.vm86_mode=function(){return!!(this.flags&flag_vm)},CPU.prototype.get_eflags=function(){return this.flags&~flags_all|!!this.getcf()|!!this.getpf()<<2|!!this.getaf()<<4|!!this.getzf()<<6|!!this.getsf()<<7|!!this.getof()<<11},CPU.prototype.update_eflags=function(e){var t=flag_rf|flag_vm|flag_vip|flag_vif,s=~flag_vip&~flag_vif&flags_mask;this.flags&flag_vm?(dbg_assert(3===this.getiopl()),t|=flag_iopl,s|=flag_vip|flag_vif):(this.protected_mode||dbg_assert(0===this.cpl),this.cpl&&(t|=flag_iopl,this.cpl>this.getiopl()&&(t|=flag_interrupt))),this.flags=(e^(this.flags^e)&t)&s|flags_default,this.flags_changed=0},CPU.prototype.get_stack_reg=function(){return this.stack_size_32?this.reg32s[reg_esp]:this.reg16[reg_sp]},CPU.prototype.set_stack_reg=function(e){this.stack_size_32?this.reg32s[reg_esp]=e:this.reg16[reg_sp]=e},CPU.prototype.adjust_stack_reg=function(e){this.stack_size_32?this.reg32s[reg_esp]+=e:this.reg16[reg_sp]+=e},CPU.prototype.get_stack_pointer=function(e){return this.stack_size_32?this.get_seg(reg_ss)+this.reg32s[reg_esp]+e|0:this.get_seg(reg_ss)+(this.reg16[reg_sp]+e&65535)|0},CPU.prototype.get_real_eip=function(){return this.instruction_pointer-this.get_seg(reg_cs)|0},CPU.prototype.call_interrupt_vector=function(e,t,s){if(CPU_LOG_VERBOSE&&this.debug.dump_state("int "+h(e)+" start ("+(t?"soft":"hard")+"ware)"),CPU_LOG_VERBOSE&&this.debug.dump_regs(),this.debug.debug_interrupt(e),dbg_assert(!1===s||"number"==typeof s),this.in_hlt=!1,this.protected_mode){if(this.vm86_mode()&&this.cr[4]&CR4_VME)throw this.debug.unimpl("VME");if(this.vm86_mode()&&t&&3>this.getiopl()&&(dbg_log("call_interrupt_vector #GP. vm86 && software int && iopl < 3",LOG_CPU),dbg_trace(LOG_CPU),this.trigger_gp(0)),(e<<3|7)>this.idtr_size)throw dbg_log(e,LOG_CPU),dbg_trace(LOG_CPU),this.debug.unimpl("#GP handler");var r=this.idtr_offset+(e<<3)|0;dbg_assert(4088>(4095&r)),this.paging&&(r=this.translate_address_system_read(r));var i=this.read16(r)|this.read16(r+6|0)<<16,_=this.read16(r+2|0),a=this.read8(r+5|0),o=a>>5&3,n=31&a;if(0==(128&a))throw this.debug.unimpl("#NP handler");if(t&&o<this.cpl&&(dbg_log("#gp software interrupt ("+h(e,2)+") and dpl < cpl",LOG_CPU),dbg_trace(LOG_CPU),this.trigger_gp(e<<3|2)),5===n)return dbg_log("interrupt to task gate: int="+h(e,2)+" sel="+h(_,4)+" dpl="+o,LOG_CPU),dbg_trace(LOG_CPU),this.do_task_switch(_,s),void(CPU_LOG_VERBOSE&&this.debug.dump_state("int end"));if(6!=(-10&n))throw dbg_trace(LOG_CPU),dbg_log("invalid type: "+h(n)),dbg_log(h(r)+" "+h(i>>>0)+" "+h(_)),this.debug.unimpl("#GP handler");if(t=1==(1&n),n=0==(8&n),r=this.lookup_segment_selector(_),dbg_assert(i>>>0<=r.effective_limit),dbg_assert(r.is_valid),r.is_null)throw dbg_log("is null"),this.debug.unimpl("#GP handler");if(!r.is_executable||r.dpl>this.cpl)throw dbg_log("not exec"),this.debug.unimpl("#GP handler");if(r.is_present||(dbg_log("not present"),this.trigger_np(e<<3|2)),e=this.get_eflags(),!r.dc_bit&&r.dpl<this.cpl){o=this.get_tss_stack_addr(r.dpl),this.tss_size_32?(a=this.read32s(o),o=this.read16(o+4|0)):(a=this.read16(o),o=this.read16(o+2|0));var d=this.lookup_segment_selector(o);if(dbg_assert(d.is_valid&&!d.is_system&&d.is_writable),d.is_null)throw this.debug.unimpl("#TS handler");if(d.rpl!==r.dpl)throw this.debug.unimpl("#TS handler");if(d.dpl!==r.dpl||!d.rw_bit)throw this.debug.unimpl("#TS handler");if(!d.is_present)throw this.debug.unimpl("#TS handler");var g=this.reg32s[reg_esp],c=this.sreg[reg_ss];e&flag_vm&&dbg_assert(0===r.dpl,"switch to non-0 dpl from vm86 mode");var p=(n?2:4)*(5+(!1!==s)+4*((e&flag_vm)===flag_vm));this.translate_address_system_write(d.base+(d.size?a-p:a-p&65535)),this.translate_address_system_write(d.base+a-1),this.cpl=r.dpl,this.cpl_changed(),this.update_cs_size(r.size),this.flags=this.flags&~flag_vm&~flag_rf,this.switch_seg(reg_ss,o),this.set_stack_reg(a),e&flag_vm&&(n?dbg_assert(!1):(this.push32(this.sreg[reg_gs]),this.push32(this.sreg[reg_fs]),this.push32(this.sreg[reg_ds]),this.push32(this.sreg[reg_es]))),n?(this.push16(c),this.push16(g)):(this.push32(c),this.push32(g))}else{if(!r.dc_bit&&r.dpl!==this.cpl)throw this.debug.unimpl("#GP handler");this.flags&flag_vm&&(dbg_assert(!1,"check error code"),this.trigger_gp(-4&_)),p=(n?2:4)*(3+(!1!==s)),this.writable_or_pagefault(this.get_stack_pointer(-p),p)}n?(this.push16(e),this.push16(this.sreg[reg_cs]),this.push16(this.get_real_eip()),!1!==s&&this.push16(s),i&=65535):(this.push32(e),this.push32(this.sreg[reg_cs]),this.push32(this.get_real_eip()),!1!==s&&this.push32(s)),e&flag_vm&&(this.switch_seg(reg_gs,0),this.switch_seg(reg_fs,0),this.switch_seg(reg_ds,0),this.switch_seg(reg_es,0)),this.sreg[reg_cs]=-4&_|this.cpl,dbg_assert((3&this.sreg[reg_cs])===this.cpl),this.update_cs_size(r.size),this.segment_limits[reg_cs]=r.effective_limit,this.segment_offsets[reg_cs]=r.base,this.instruction_pointer=this.get_seg(reg_cs)+i|0,this.flags=this.flags&~flag_nt&~flag_vm&~flag_rf&~flag_trap,t?this.page_fault||this.handle_irqs():this.flags&=~flag_interrupt}else i=e<<2,s=this.read16(i),i=this.read16(i+2|0),this.push16(this.get_eflags()),this.push16(this.sreg[reg_cs]),this.push16(this.get_real_eip()),this.flags&=~flag_interrupt,this.switch_cs_real_mode(i),this.instruction_pointer=this.get_seg(reg_cs)+s|0;CPU_LOG_VERBOSE&&this.debug.dump_state("int end")},CPU.prototype.iret16=function(){this.iret(!0)},CPU.prototype.iret32=function(){this.iret(!1)},CPU.prototype.iret=function(e){if(CPU_LOG_VERBOSE&&this.debug.dump_state("iret"+(e?"16":"32")+" start"),this.vm86_mode()&&3>this.getiopl()&&(dbg_log("#gp iret vm86 mode, iopl != 3",LOG_CPU),this.trigger_gp(0)),e)var t=this.safe_read16(this.get_stack_pointer(0)),s=this.safe_read16(this.get_stack_pointer(2)),r=this.safe_read16(this.get_stack_pointer(4));else t=this.safe_read32s(this.get_stack_pointer(0)),s=this.safe_read16(this.get_stack_pointer(4)),r=this.safe_read32s(this.get_stack_pointer(8));if(!this.protected_mode||this.vm86_mode()&&3===this.getiopl()){if(4294901760&t)throw this.debug.unimpl("#GP handler");this.switch_cs_real_mode(s),this.instruction_pointer=t+this.get_seg(reg_cs)|0,e?(this.update_eflags(r|-65536&this.flags),this.adjust_stack_reg(6)):(this.update_eflags(r),this.adjust_stack_reg(12)),CPU_LOG_VERBOSE&&this.debug.dump_state("iret end")}else{if(dbg_assert(!this.vm86_mode()),this.flags&flag_nt){if(DEBUG)throw this.debug.unimpl("nt");this.trigger_gp(0)}if(r&flag_vm){if(0===this.cpl){dbg_assert(!e),dbg_assert(0==(-65536&t));var i=this.safe_read32s(this.get_stack_pointer(12)),_=this.safe_read16(this.get_stack_pointer(16));e=this.safe_read16(this.get_stack_pointer(20));var a=this.safe_read16(this.get_stack_pointer(24)),o=this.safe_read16(this.get_stack_pointer(28)),n=this.safe_read16(this.get_stack_pointer(32));return this.update_eflags(r),this.flags|=flag_vm,this.switch_cs_real_mode(s),this.instruction_pointer=(65535&t)+this.get_seg(reg_cs)|0,this.switch_seg(reg_es,e),this.switch_seg(reg_ds,a),this.switch_seg(reg_fs,o),this.switch_seg(reg_gs,n),this.adjust_stack_reg(36),this.reg32s[reg_esp]=i,this.switch_seg(reg_ss,_),this.cpl=3,this.cpl_changed(),this.update_cs_size(!1),void(CPU_LOG_VERBOSE&&this.debug.dump_state("iret end"))}dbg_log("vm86 flag ignored because cpl != 0",LOG_CPU),r&=~flag_vm}if(a=this.lookup_segment_selector(s),dbg_assert(a.is_valid),dbg_assert(t>>>0<=a.effective_limit),a.is_null)throw this.debug.unimpl("is null");if(!a.is_present)throw this.debug.unimpl("not present");if(!a.is_executable)throw this.debug.unimpl("not exec");if(a.rpl<this.cpl)throw this.debug.unimpl("rpl < cpl");if(a.dc_bit&&a.dpl>a.rpl)throw this.debug.unimpl("conforming and dpl > rpl");a.dc_bit||a.rpl===a.dpl||(dbg_log("#gp iret: non-conforming cs and rpl != dpl, dpl="+a.dpl+" rpl="+a.rpl,LOG_CPU),this.trigger_gp(-4&s)),a.rpl>this.cpl?(e?(i=this.safe_read16(this.get_stack_pointer(6)),_=this.safe_read16(this.get_stack_pointer(8))):(i=this.safe_read32s(this.get_stack_pointer(12)),_=this.safe_read16(this.get_stack_pointer(16))),o=this.lookup_segment_selector(_),n=a.rpl,o.is_null&&(dbg_log("#GP for loading 0 in SS sel="+h(_,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_gp(0)),o.is_valid&&!o.is_system&&o.rpl===n&&o.is_writable&&o.dpl===n||(dbg_log("#GP for loading invalid in SS sel="+h(_,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_gp(-4&_)),o.is_present||(dbg_log("#SS for loading non-present in SS sel="+h(_,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_ss(-4&_)),e?this.update_eflags(r|-65536&this.flags):this.update_eflags(r),this.cpl=a.rpl,this.cpl_changed(),this.switch_seg(reg_ss,_),this.set_stack_reg(i),0===this.cpl&&(this.flags=this.flags&~flag_vif&~flag_vip|r&(flag_vif|flag_vip))):a.rpl===this.cpl?(e?(this.adjust_stack_reg(6),this.update_eflags(r|-65536&this.flags)):(this.adjust_stack_reg(12),this.update_eflags(r)),0===this.cpl&&(this.flags=this.flags&~flag_vif&~flag_vip|r&(flag_vif|flag_vip))):dbg_assert(!1),this.sreg[reg_cs]=s,dbg_assert((3&s)===this.cpl),this.update_cs_size(a.size),this.segment_limits[reg_cs]=a.effective_limit,this.segment_offsets[reg_cs]=a.base,this.instruction_pointer=t+this.get_seg(reg_cs)|0,CPU_LOG_VERBOSE&&this.debug.dump_state("iret"+(e?"16":"32")+" end")}this.handle_irqs()},CPU.prototype.switch_cs_real_mode=function(e){dbg_assert(!this.protected_mode||this.vm86_mode()),this.sreg[reg_cs]=e,this.segment_is_null[reg_cs]=0,this.segment_offsets[reg_cs]=e<<4},CPU.prototype.far_return=function(e,t,s){if(dbg_assert("number"==typeof t&&65536>t&&0<=t),CPU_LOG_VERBOSE&&this.debug.dump_state("far ret start"),this.protected_mode||dbg_assert(!this.is_32),!this.protected_mode||this.vm86_mode())this.switch_cs_real_mode(t),this.instruction_pointer=this.get_seg(reg_cs)+e|0,this.adjust_stack_reg(2*(this.is_osize_32()?4:2)+s);else{var r=this.lookup_segment_selector(t);if(r.is_null&&(dbg_log("null cs",LOG_CPU),this.trigger_gp(0)),r.is_valid||(dbg_log("invalid cs: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),r.is_system&&(dbg_assert(!1,"is system in far return"),this.trigger_gp(-4&t)),r.is_executable||(dbg_log("non-executable cs: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),r.rpl<this.cpl&&(dbg_log("cs rpl < cpl: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),r.dc_bit&&r.dpl>r.rpl&&(dbg_log("cs conforming and dpl > rpl: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),r.dc_bit||r.dpl===r.rpl||(dbg_log("cs non-conforming and dpl != rpl: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),r.is_present||(dbg_log("#NP for loading not-present in cs sel="+h(t,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_np(-4&t)),r.rpl>this.cpl){if(dbg_log("far return privilege change cs: "+h(t)+" from="+this.cpl+" to="+r.rpl+" is_16="+this.is_osize_32(),LOG_CPU),this.is_osize_32())var i=this.safe_read32s(this.get_stack_pointer(s+8)),_=this.safe_read16(this.get_stack_pointer(s+12));else i=this.safe_read16(this.get_stack_pointer(s+4)),_=this.safe_read16(this.get_stack_pointer(s+6));this.cpl=r.rpl,this.cpl_changed(),this.switch_seg(reg_ss,_),this.set_stack_reg(i+s)}else this.is_osize_32()?this.adjust_stack_reg(8+s):this.adjust_stack_reg(4+s);this.update_cs_size(r.size),this.segment_is_null[reg_cs]=0,this.segment_limits[reg_cs]=r.effective_limit,this.segment_offsets[reg_cs]=r.base,this.sreg[reg_cs]=t,dbg_assert((3&t)===this.cpl),this.instruction_pointer=this.get_seg(reg_cs)+e|0,CPU_LOG_VERBOSE&&this.debug.dump_state("far ret end")}},CPU.prototype.far_jump=function(e,t,s){if(dbg_assert("number"==typeof t&&65536>t&&0<=t),CPU_LOG_VERBOSE&&this.debug.dump_state("far "+["jump","call"][+s]),!this.protected_mode||this.vm86_mode())s&&(this.is_osize_32()?(this.writable_or_pagefault(this.get_stack_pointer(-8),8),this.push32(this.sreg[reg_cs]),this.push32(this.get_real_eip())):(this.writable_or_pagefault(this.get_stack_pointer(-4),4),this.push16(this.sreg[reg_cs]),this.push16(this.get_real_eip()))),this.switch_cs_real_mode(t),this.instruction_pointer=this.get_seg(reg_cs)+e|0;else{var r=this.lookup_segment_selector(t);if(r.is_null&&(dbg_log("#gp null cs",LOG_CPU),this.trigger_gp(0)),r.is_valid||(dbg_log("#gp invalid cs: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),r.is_system){if(dbg_assert(s,"TODO: Jump"),dbg_log("system type cs: "+h(t),LOG_CPU),12!==r.type&&4!==r.type)throw this.debug.unimpl("load system segment descriptor, type = "+(15&r.access)+" ("+{9:"Available 386 TSS",11:"Busy 386 TSS",4:"286 Call Gate",12:"386 Call Gate"}[15&r.access]+")");e=4===r.type,(r.dpl<this.cpl||r.dpl<r.rpl)&&(dbg_log("#gp cs gate dpl < cpl or dpl < rpl: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),r.is_present||(dbg_log("#NP for loading not-present in gate cs sel="+h(t,4),LOG_CPU),this.trigger_np(-4&t)),t=r.raw0>>>16;var i=this.lookup_segment_selector(t);if(i.is_null&&(dbg_log("#gp null cs",LOG_CPU),this.trigger_gp(0)),i.is_valid||(dbg_log("#gp invalid cs: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),i.is_executable||(dbg_log("#gp non-executable cs: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),i.dpl>this.cpl&&(dbg_log("#gp dpl > cpl: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),i.is_present||(dbg_log("#NP for loading not-present in cs sel="+h(t,4),LOG_CPU),this.trigger_np(-4&t)),!i.dc_bit&&i.dpl<this.cpl){dbg_log("more privilege call gate is_16="+e+" from="+this.cpl+" to="+i.dpl);var _=this.get_tss_stack_addr(i.dpl);if(this.tss_size_32){var a=this.read32s(_);_=this.read16(_+4|0)}else a=this.read16(_),_=this.read16(_+2|0);var o=this.lookup_segment_selector(_);if(dbg_assert(o.is_valid&&!o.is_system&&o.is_writable),o.is_null)throw this.debug.unimpl("#TS handler");if(o.rpl!==i.dpl)throw this.debug.unimpl("#TS handler");if(o.dpl!==i.dpl||!o.rw_bit)throw this.debug.unimpl("#TS handler");if(!o.is_present)throw this.debug.unimpl("#SS handler");var n=31&r.raw1,d=e?4:8;s&&(d+=e?4+2*n:8+4*n),o.size?this.writable_or_pagefault(o.base+a-d|0,d):this.writable_or_pagefault(o.base+(a-d&65535)|0,d),d=this.reg32s[reg_esp];var g=this.sreg[reg_ss];if(o=this.get_stack_pointer(0),this.cpl=i.dpl,this.cpl_changed(),this.update_cs_size(i.size),this.switch_seg(reg_ss,_),this.set_stack_reg(a),e?(this.push16(g),this.push16(d)):(this.push32(g),this.push32(d)),s)if(e){for(a=n-1;0<=a;a--)_=this.safe_read16(o+2*a),this.push16(_);this.push16(this.sreg[reg_cs]),this.push16(this.get_real_eip())}else{for(a=n-1;0<=a;a--)_=this.safe_read32s(o+4*a),this.push32(_);this.push32(this.sreg[reg_cs]),this.push32(this.get_real_eip())}}else dbg_log("same privilege call gate is_16="+e+" from="+this.cpl+" to="+i.dpl+" conforming="+i.dc_bit),s&&(e?(this.writable_or_pagefault(this.get_stack_pointer(-4),4),this.push16(this.sreg[reg_cs]),this.push16(this.get_real_eip())):(this.writable_or_pagefault(this.get_stack_pointer(-8),8),this.push32(this.sreg[reg_cs]),this.push32(this.get_real_eip())));a=65535&r.raw0,e||(a|=4294901760&r.raw1),dbg_log("call gate eip="+h(a>>>0)+" cs="+h(t)+" conforming="+i.dc_bit),dbg_assert(a>>>0<=i.effective_limit,"todo: #gp"),this.update_cs_size(i.size),this.segment_is_null[reg_cs]=0,this.segment_limits[reg_cs]=i.effective_limit,this.segment_offsets[reg_cs]=i.base,this.sreg[reg_cs]=-4&t|this.cpl,dbg_assert((3&this.sreg[reg_cs])===this.cpl),this.instruction_pointer=this.get_seg(reg_cs)+a|0}else r.is_executable||(dbg_log("#gp non-executable cs: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),r.dc_bit?r.dpl>this.cpl&&(dbg_log("#gp cs dpl > cpl: "+h(t),LOG_CPU),this.trigger_gp(-4&t)):(r.rpl>this.cpl||r.dpl!==this.cpl)&&(dbg_log("#gp cs rpl > cpl or dpl != cpl: "+h(t),LOG_CPU),this.trigger_gp(-4&t)),r.is_present||(dbg_log("#NP for loading not-present in cs sel="+h(t,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_np(-4&t)),s&&(this.is_osize_32()?(this.writable_or_pagefault(this.get_stack_pointer(-8),8),this.push32(this.sreg[reg_cs]),this.push32(this.get_real_eip())):(this.writable_or_pagefault(this.get_stack_pointer(-4),4),this.push16(this.sreg[reg_cs]),this.push16(this.get_real_eip()))),dbg_assert(e>>>0<=r.effective_limit,"todo: #gp"),this.update_cs_size(r.size),this.segment_is_null[reg_cs]=0,this.segment_limits[reg_cs]=r.effective_limit,this.segment_offsets[reg_cs]=r.base,this.sreg[reg_cs]=-4&t|this.cpl,this.instruction_pointer=this.get_seg(reg_cs)+e|0;CPU_LOG_VERBOSE&&this.debug.dump_state("far "+["jump","call"][+s]+" end")}},CPU.prototype.get_tss_stack_addr=function(e){if(this.tss_size_32){if(((e=4+(e<<3)|0)+5|0)>this.segment_limits[reg_tr])throw this.debug.unimpl("#TS handler");e=e+this.segment_offsets[reg_tr]|0,dbg_assert(4090>=(4095&e))}else{if(((e=2+(e<<2)|0)+5|0)>this.segment_limits[reg_tr])throw this.debug.unimpl("#TS handler");e=e+this.segment_offsets[reg_tr]|0,dbg_assert(4092>=(4095&e))}return this.paging&&(e=this.translate_address_system_read(e)),e},CPU.prototype.do_task_switch=function(e,t){dbg_assert(this.tss_size_32,"TODO"),dbg_log("do_task_switch sel="+h(e),LOG_CPU);var s=this.lookup_segment_selector(e);dbg_assert(3==(2|s.type)||11==(2|s.type));var r=3>=s.type,i=2==(2&s.type);if(!s.is_valid||s.is_null||!s.from_gdt)throw this.debug.unimpl("#GP handler");if(11==(31&s.access))throw this.debug.unimpl("#GP handler");if(!s.is_present)throw this.debug.unimpl("#NP handler");if(103>s.effective_limit)throw this.debug.unimpl("#NP handler");var _=this.segment_offsets[reg_tr],a=this.get_eflags();i&&(a&=~flag_nt),this.writable_or_pagefault(_,102),this.safe_write32(_+TSR_EIP,this.get_real_eip()),this.safe_write32(_+TSR_EFLAGS,a),this.safe_write32(_+TSR_EAX,this.reg32s[reg_eax]),this.safe_write32(_+TSR_ECX,this.reg32s[reg_ecx]),this.safe_write32(_+TSR_EDX,this.reg32s[reg_edx]),this.safe_write32(_+TSR_EBX,this.reg32s[reg_ebx]),this.safe_write32(_+TSR_ESP,this.reg32s[reg_esp]),this.safe_write32(_+TSR_EBP,this.reg32s[reg_ebp]),this.safe_write32(_+TSR_ESI,this.reg32s[reg_esi]),this.safe_write32(_+TSR_EDI,this.reg32s[reg_edi]),this.safe_write32(_+TSR_ES,this.sreg[reg_es]),this.safe_write32(_+TSR_CS,this.sreg[reg_cs]),this.safe_write32(_+TSR_SS,this.sreg[reg_ss]),this.safe_write32(_+TSR_DS,this.sreg[reg_ds]),this.safe_write32(_+TSR_FS,this.sreg[reg_fs]),this.safe_write32(_+TSR_GS,this.sreg[reg_gs]),this.write8(s.table_offset+5|0,2|this.read8(s.table_offset+5|0)),i=s.base,dbg_assert(!r,"unimplemented"),this.safe_write16(i+TSR_BACKLINK,this.sreg[reg_tr]),a=this.safe_read32s(i+TSR_CR3),this.flags&=~flag_vm;var o=this.safe_read32s(i+TSR_EIP),n=this.safe_read16(i+TSR_CS),d=this.lookup_segment_selector(n);if(d.is_null)throw dbg_log("null cs",LOG_CPU),this.debug.unimpl("#TS handler");if(!d.is_valid)throw dbg_log("invalid cs: "+h(e),LOG_CPU),this.debug.unimpl("#TS handler");if(d.is_system)throw this.debug.unimpl("#TS handler");if(!d.is_executable)throw this.debug.unimpl("#TS handler");if(d.dc_bit&&d.dpl>d.rpl)throw dbg_log("cs conforming and dpl > rpl: "+h(e),LOG_CPU),this.debug.unimpl("#TS handler");if(!d.dc_bit&&d.dpl!==d.rpl)throw dbg_log("cs non-conforming and dpl != rpl: "+h(e),LOG_CPU),this.debug.unimpl("#TS handler");if(!d.is_present)throw dbg_log("#NP for loading not-present in cs sel="+h(e,4),LOG_CPU),this.debug.unimpl("#TS handler");if(this.segment_is_null[reg_cs]=0,this.segment_limits[reg_cs]=d.effective_limit,this.segment_offsets[reg_cs]=d.base,this.sreg[reg_cs]=n,this.cpl=d.dpl,this.cpl_changed(),dbg_assert((3&this.sreg[reg_cs])===this.cpl),dbg_assert(o>>>0<=d.effective_limit,"todo: #gp"),this.update_cs_size(d.size),n=this.safe_read32s(i+TSR_EFLAGS),this.safe_write32(_+TSR_BACKLINK,e),(n|=flag_nt)&flag_vm)throw this.debug.unimpl("task switch to VM mode");this.update_eflags(n),this.flags|=flag_nt,_=this.safe_read16(i+TSR_LDT),this.load_ldt(_),this.reg32s[reg_eax]=this.safe_read32s(i+TSR_EAX),this.reg32s[reg_ecx]=this.safe_read32s(i+TSR_ECX),this.reg32s[reg_edx]=this.safe_read32s(i+TSR_EDX),this.reg32s[reg_ebx]=this.safe_read32s(i+TSR_EBX),this.reg32s[reg_esp]=this.safe_read32s(i+TSR_ESP),this.reg32s[reg_ebp]=this.safe_read32s(i+TSR_EBP),this.reg32s[reg_esi]=this.safe_read32s(i+TSR_ESI),this.reg32s[reg_edi]=this.safe_read32s(i+TSR_EDI),this.switch_seg(reg_es,this.safe_read16(i+TSR_ES)),this.switch_seg(reg_ss,this.safe_read16(i+TSR_SS)),this.switch_seg(reg_ds,this.safe_read16(i+TSR_DS)),this.switch_seg(reg_fs,this.safe_read16(i+TSR_FS)),this.switch_seg(reg_gs,this.safe_read16(i+TSR_GS)),this.instruction_pointer=this.get_seg(reg_cs)+o|0,this.segment_offsets[reg_tr]=s.base,this.segment_limits[reg_tr]=s.effective_limit,this.sreg[reg_tr]=e,this.cr[3]=a,dbg_assert(0==(4095&this.cr[3])),this.clear_tlb(),this.cr[0]|=CR0_TS,!1!==t&&(r?this.push16(65535&t):this.push32(t))},CPU.prototype.hlt_op=function(){if(this.cpl&&this.trigger_gp(0),0==(this.flags&flag_interrupt))throw this.debug.show("cpu halted"),this.bus.send("cpu-event-halt"),DEBUG&&this.debug.dump_regs(),"HALT";throw this.in_hlt=!0,MAGIC_CPU_EXCEPTION},CPU.prototype.raise_exception=function(e){throw this.call_interrupt_vector(e,!1,!1),MAGIC_CPU_EXCEPTION},CPU.prototype.raise_exception_with_code=function(e,t){throw dbg_assert("number"==typeof t),this.call_interrupt_vector(e,!1,t),MAGIC_CPU_EXCEPTION},CPU.prototype.trigger_de=function(){this.instruction_pointer=this.previous_ip,this.raise_exception(0)},CPU.prototype.trigger_ud=function(){this.instruction_pointer=this.previous_ip,this.raise_exception(6)},CPU.prototype.trigger_nm=function(){this.instruction_pointer=this.previous_ip,this.raise_exception(7)},CPU.prototype.trigger_ts=function(e){this.instruction_pointer=this.previous_ip,this.raise_exception_with_code(10,e)},CPU.prototype.trigger_gp=function(e){this.instruction_pointer=this.previous_ip,this.raise_exception_with_code(13,e)},CPU.prototype.trigger_np=function(e){this.instruction_pointer=this.previous_ip,this.raise_exception_with_code(11,e)},CPU.prototype.trigger_ss=function(e){this.instruction_pointer=this.previous_ip,this.raise_exception_with_code(12,e)},CPU.prototype.task_switch_test=function(){this.cr[0]&(CR0_EM|CR0_TS)&&this.trigger_nm()},CPU.prototype.task_switch_test_mmx=function(){this.cr[0]&(CR0_EM|CR0_TS)&&(this.cr[0]&CR0_TS?this.trigger_nm():this.trigger_ud())},CPU.prototype.todo=function(){if(DEBUG)throw dbg_trace(),"TODO";this.trigger_ud()},CPU.prototype.undefined_instruction=function(){dbg_assert(!1,"Possible fault: undefined instruction"),this.trigger_ud()},CPU.prototype.unimplemented_sse=function(){dbg_log("No SSE",LOG_CPU),dbg_assert(!1),this.trigger_ud()},CPU.prototype.get_seg_prefix_ds=function(){return this.get_seg_prefix(reg_ds)},CPU.prototype.get_seg_prefix_ss=function(){return this.get_seg_prefix(reg_ss)},CPU.prototype.get_seg_prefix_cs=function(){return this.get_seg_prefix(reg_cs)},CPU.prototype.get_seg_prefix=function(e){var t=this.prefixes&PREFIX_MASK_SEGMENT;return t?t===SEG_PREFIX_ZERO?0:this.get_seg(t-1):this.get_seg(e)},CPU.prototype.get_seg=function(e){return dbg_assert(0<=e&&8>e),this.protected_mode&&this.segment_is_null[e]&&(dbg_assert(e!==reg_cs&&e!==reg_ss),dbg_trace(),dbg_log("#gp Use null segment: "+e+" sel="+h(this.sreg[e],4),LOG_CPU),this.trigger_gp(0)),this.segment_offsets[e]},CPU.prototype.read_e8=function(){return 192>this.modrm_byte?this.safe_read8(this.modrm_resolve(this.modrm_byte)):this.reg8[this.modrm_byte<<2&12|this.modrm_byte>>2&1]},CPU.prototype.read_e8s=function(){return this.read_e8()<<24>>24},CPU.prototype.read_e16=function(){return 192>this.modrm_byte?this.safe_read16(this.modrm_resolve(this.modrm_byte)):this.reg16[this.modrm_byte<<1&14]},CPU.prototype.read_e16s=function(){return this.read_e16()<<16>>16},CPU.prototype.read_e32s=function(){return 192>this.modrm_byte?this.safe_read32s(this.modrm_resolve(this.modrm_byte)):this.reg32s[7&this.modrm_byte]},CPU.prototype.read_e32=function(){return this.read_e32s()>>>0},CPU.prototype.read_mmx_mem32s=function(){return 192>this.modrm_byte?this.safe_read32s(this.modrm_resolve(this.modrm_byte)):this.reg_mmxs[2*(7&this.modrm_byte)]},CPU.prototype.read_mmx_mem64s=function(){return 192>this.modrm_byte?this.safe_read64s(this.modrm_resolve(this.modrm_byte)):this.create_atom64s(this.reg_mmxs[2*(7&this.modrm_byte)],this.reg_mmxs[2*(7&this.modrm_byte)+1])},CPU.prototype.read_xmm_mem64s=function(){if(192>this.modrm_byte)return this.safe_read64s(this.modrm_resolve(this.modrm_byte));var e=(7&this.modrm_byte)<<2;return this.create_atom64s(this.reg_xmm32s[e],this.reg_xmm32s[1|e])},CPU.prototype.read_xmm_mem128s=function(){if(192>this.modrm_byte)return this.safe_read128s_aligned(this.modrm_resolve(this.modrm_byte));var e=(7&this.modrm_byte)<<2;return this.create_atom128s(this.reg_xmm32s[e],this.reg_xmm32s[1|e],this.reg_xmm32s[2|e],this.reg_xmm32s[3|e])},CPU.prototype.read_xmm_mem128s_unaligned=function(){if(192>this.modrm_byte)return this.safe_read128s_unaligned(this.modrm_resolve(this.modrm_byte));var e=(7&this.modrm_byte)<<2;return this.create_atom128s(this.reg_xmm32s[e],this.reg_xmm32s[1|e],this.reg_xmm32s[2|e],this.reg_xmm32s[3|e])},CPU.prototype.set_e8=function(e){if(192>this.modrm_byte){var t=this.modrm_resolve(this.modrm_byte);this.safe_write8(t,e)}else this.reg8[this.modrm_byte<<2&12|this.modrm_byte>>2&1]=e},CPU.prototype.set_e16=function(e){if(192>this.modrm_byte){var t=this.modrm_resolve(this.modrm_byte);this.safe_write16(t,e)}else this.reg16[this.modrm_byte<<1&14]=e},CPU.prototype.set_e32=function(e){if(192>this.modrm_byte){var t=this.modrm_resolve(this.modrm_byte);this.safe_write32(t,e)}else this.reg32s[7&this.modrm_byte]=e},CPU.prototype.set_mmx_mem64s=function(e,t){if(192>this.modrm_byte){var s=this.modrm_resolve(this.modrm_byte);this.safe_write64(s,e,t)}else this.reg_mmxs[2*(7&this.modrm_byte)]=e,this.reg_mmxs[2*(7&this.modrm_byte)+1]=t},CPU.prototype.read_write_e8=function(){if(192>this.modrm_byte){var e=this.modrm_resolve(this.modrm_byte);return this.phys_addr=this.translate_address_write(e),this.read8(this.phys_addr)}return this.reg8[this.modrm_byte<<2&12|this.modrm_byte>>2&1]},CPU.prototype.write_e8=function(e){192>this.modrm_byte?this.write8(this.phys_addr,e):this.reg8[this.modrm_byte<<2&12|this.modrm_byte>>2&1]=e},CPU.prototype.read_write_e16=function(){if(192>this.modrm_byte){var e=this.modrm_resolve(this.modrm_byte);return this.phys_addr=this.translate_address_write(e),this.paging&&4095==(4095&e)?(this.phys_addr_high=this.translate_address_write(e+1|0),dbg_assert(this.phys_addr_high),this.virt_boundary_read16(this.phys_addr,this.phys_addr_high)):(this.phys_addr_high=0,this.read16(this.phys_addr))}return this.reg16[this.modrm_byte<<1&14]},CPU.prototype.write_e16=function(e){192>this.modrm_byte?this.phys_addr_high?this.virt_boundary_write16(this.phys_addr,this.phys_addr_high,e):this.write16(this.phys_addr,e):this.reg16[this.modrm_byte<<1&14]=e},CPU.prototype.read_write_e32=function(){if(192>this.modrm_byte){var e=this.modrm_resolve(this.modrm_byte);return this.phys_addr=this.translate_address_write(e),this.paging&&4093<=(4095&e)?(this.phys_addr_high=this.translate_address_write(e+3&-4)|e+3&3,dbg_assert(this.phys_addr_high),this.virt_boundary_read32s(this.phys_addr,this.phys_addr_high)):(this.phys_addr_high=0,this.read32s(this.phys_addr))}return this.reg32s[7&this.modrm_byte]},CPU.prototype.write_e32=function(e){192>this.modrm_byte?this.phys_addr_high?this.virt_boundary_write32(this.phys_addr,this.phys_addr_high,e):this.write32(this.phys_addr,e):this.reg32s[7&this.modrm_byte]=e},CPU.prototype.read_reg_e16=function(){return this.reg16[this.modrm_byte<<1&14]},CPU.prototype.write_reg_e16=function(e){this.reg16[this.modrm_byte<<1&14]=e},CPU.prototype.read_reg_e32s=function(){return this.reg32s[7&this.modrm_byte]},CPU.prototype.write_reg_e32=function(e){this.reg32s[7&this.modrm_byte]=e},CPU.prototype.read_g8=function(){return this.reg8[this.modrm_byte>>1&12|this.modrm_byte>>5&1]},CPU.prototype.write_g8=function(e){this.reg8[this.modrm_byte>>1&12|this.modrm_byte>>5&1]=e},CPU.prototype.read_g16=function(){return this.reg16[this.modrm_byte>>2&14]},CPU.prototype.read_g16s=function(){return this.reg16s[this.modrm_byte>>2&14]},CPU.prototype.write_g16=function(e){this.reg16[this.modrm_byte>>2&14]=e},CPU.prototype.read_g32s=function(){return this.reg32s[this.modrm_byte>>3&7]},CPU.prototype.write_g32=function(e){this.reg32[this.modrm_byte>>3&7]=e},CPU.prototype.read_xmm64s=function(){return this.create_atom64s(this.reg_xmm32s[(this.modrm_byte>>3&7)<<2],this.reg_xmm32s[(this.modrm_byte>>3&7)<<2|1])},CPU.prototype.read_xmm128s=function(){var e=(this.modrm_byte>>3&7)<<2;return this.create_atom128s(this.reg_xmm32s[0|e],this.reg_xmm32s[1|e],this.reg_xmm32s[2|e],this.reg_xmm32s[3|e])},CPU.prototype.read_mmx64s=function(){return this.create_atom64s(this.reg_mmxs[2*(this.modrm_byte>>3&7)],this.reg_mmxs[2*(this.modrm_byte>>3&7)+1])},CPU.prototype.write_mmx64s=function(e,t){this.reg_mmxs[2*(this.modrm_byte>>3&7)]=e,this.reg_mmxs[2*(this.modrm_byte>>3&7)+1]=t},CPU.prototype.write_xmm64=function(e,t){var s=(this.modrm_byte>>3&7)<<2;this.reg_xmm32s[s]=e,this.reg_xmm32s[s+1]=t},CPU.prototype.write_xmm128s=function(e,t,s,r){var i=(this.modrm_byte>>3&7)<<2;this.reg_xmm32s[i]=e,this.reg_xmm32s[i+1]=t,this.reg_xmm32s[i+2]=s,this.reg_xmm32s[i+3]=r},CPU.prototype.pic_call_irq=function(e){try{this.previous_ip=this.instruction_pointer,this.call_interrupt_vector(e,!1,!1)}catch(e){this.exception_cleanup(e)}},CPU.prototype.handle_irqs=function(){dbg_assert(!this.page_fault),this.diverged(),this.flags&flag_interrupt&&!this.page_fault&&(this.devices.pic&&this.devices.pic.acknowledge_irq(),this.devices.apic&&this.devices.apic.acknowledge_irq())},CPU.prototype.device_raise_irq=function(e){dbg_assert(1===arguments.length),this.devices.pic&&this.devices.pic.set_irq(e),this.devices.ioapic&&this.devices.ioapic.set_irq(e)},CPU.prototype.device_lower_irq=function(e){this.devices.pic&&this.devices.pic.clear_irq(e),this.devices.ioapic&&this.devices.ioapic.clear_irq(e)},CPU.prototype.test_privileges_for_io=function(e,t){if(this.protected_mode&&(this.cpl>this.getiopl()||this.flags&flag_vm)){this.tss_size_32||(dbg_log("#GP for port io, 16-bit TSS port="+h(e)+" size="+t,LOG_CPU),CPU_LOG_VERBOSE&&this.debug.dump_state(),this.trigger_gp(0));var s=this.segment_limits[reg_tr],r=this.segment_offsets[reg_tr];if(103<=s){dbg_assert(4095>(r+100+2&4095));var i=this.read16(this.translate_address_system_read(r+100+2|0));if(s>=(i+((e+t-1|0)>>3)|0)&&(s=(1<<t)-1<<(7&e),r=this.translate_address_system_read(r+i+(e>>3)|0),i=65280&s?this.read16(r):this.read8(r),dbg_assert(4095>(4095&r)),!(i&s)))return}dbg_log("#GP for port io port="+h(e)+" size="+t,LOG_CPU),CPU_LOG_VERBOSE&&this.debug.dump_state(),this.trigger_gp(0)}},CPU.prototype.cpuid=function(){var e=0,t=0,s=0,r=0;switch(this.reg32s[reg_eax]){case 0:e=5,r=1970169159,s=1231384169,t=1818588270;break;case 1:e=3939,r=67584,t=1082130432,VMWARE_HYPERVISOR_PORT&&(t|=-2147483648),s=125872440|(this.fpu?1:0),ENABLE_ACPI&&this.apic_enabled&&(s|=512);break;case 2:e=1717260289,t=r=0,s=8024064;break;case 4:switch(this.reg32s[reg_ecx]){case 0:e=289,r=29360191,t=63,s=1;break;case 1:e=290,r=29360191,t=63,s=1;break;case 2:e=323,r=96469055,t=4095,s=1}break;case 5:r=e=64,t=3,s=1319200;break
;case-2147483648:e=5;break;case 1073741824:VMWARE_HYPERVISOR_PORT&&(r=1635208534,t=1297507698,s=1701994871);break;default:dbg_log("cpuid: unimplemented eax: "+h(this.reg32[reg_eax]),LOG_CPU)}dbg_log("cpuid: eax="+h(this.reg32[reg_eax],8)+" cl="+h(this.reg8[reg_cl],2),LOG_CPU),this.reg32s[reg_eax]=e,this.reg32s[reg_ecx]=t,this.reg32s[reg_edx]=s,this.reg32s[reg_ebx]=r},CPU.prototype.update_cs_size=function(e){dbg_assert("boolean"==typeof e),this.is_32!==e&&(this.clear_instruction_cache(),this.is_32=e,this.update_operand_size())},CPU.prototype.update_operand_size=function(){this.table=this.is_32?this.table32:this.table16},CPU.prototype.lookup_segment_selector=function(e){dbg_assert("number"==typeof e&&0<=e&&65536>e);var t=0==(4&e),s=-8&e,r={rpl:3&e,from_gdt:t,is_null:!1,is_valid:!0,base:0,access:0,flags:0,type:0,dpl:0,is_system:!1,is_present:!1,is_executable:!1,rw_bit:!1,dc_bit:!1,size:!1,is_conforming_executable:!1,effective_limit:0,is_writable:!1,is_readable:!1,table_offset:0,raw0:0,raw1:0};if(t)var i=this.gdtr_offset,_=this.gdtr_size;else i=this.segment_offsets[reg_ldtr],_=this.segment_limits[reg_ldtr];return t&&0===s?(r.is_null=!0,r):(7|e)>_?(dbg_log("Selector "+h(e,4)+" is outside of the "+(t?"g":"l")+"dt limits",LOG_CPU),r.is_valid=!1,r):(i=i+s|0,this.paging&&(i=this.translate_address_system_read(i)),r.table_offset=i,r.base=this.read16(i+2|0)|this.read8(i+4|0)<<16|this.read8(i+7|0)<<24,r.access=this.read8(i+5|0),r.flags=this.read8(i+6|0)>>4,r.raw0=this.read32s(0|i),r.raw1=this.read32s(i+4|0),r.type=15&r.access,r.dpl=r.access>>5&3,r.is_system=0==(16&r.access),r.is_present=128==(128&r.access),r.is_executable=8==(8&r.access),r.rw_bit=2==(2&r.access),r.dc_bit=4==(4&r.access),r.is_conforming_executable=r.dc_bit&&r.is_executable,r.size=4==(4&r.flags),e=this.read16(i)|(15&this.read8(i+6|0))<<16,r.effective_limit=8&r.flags?(e<<12|4095)>>>0:e,r.is_writable=r.rw_bit&&!r.is_executable,r.is_readable=r.rw_bit||!r.is_executable,r)},CPU.prototype.switch_seg=function(e,t){if(dbg_assert(0<=e&&5>=e),dbg_assert("number"==typeof t&&65536>t&&0<=t),!this.protected_mode||this.vm86_mode())this.sreg[e]=t,this.segment_is_null[e]=0,this.segment_offsets[e]=t<<4,e===reg_ss&&(this.stack_size_32=!1);else{var s=this.lookup_segment_selector(t);if(e===reg_ss)s.is_null&&(dbg_log("#GP for loading 0 in SS sel="+h(t,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_gp(0)),s.is_valid&&!s.is_system&&s.rpl===this.cpl&&s.is_writable&&s.dpl===this.cpl||(dbg_log("#GP for loading invalid in SS sel="+h(t,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_gp(-4&t)),s.is_present||(dbg_log("#SS for loading non-present in SS sel="+h(t,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_ss(-4&t)),this.stack_size_32=s.size;else if(e===reg_cs)dbg_assert(!1);else{if(s.is_null)return this.sreg[e]=t,void(this.segment_is_null[e]=1);(!s.is_valid||s.is_system||!s.is_readable||!s.is_conforming_executable&&(s.rpl>s.dpl||this.cpl>s.dpl))&&(dbg_log("#GP for loading invalid in seg "+e+" sel="+h(t,4),LOG_CPU),this.debug.dump_state(),this.debug.dump_regs(),dbg_trace(LOG_CPU),this.trigger_gp(-4&t)),s.is_present||(dbg_log("#NP for loading not-present in seg "+e+" sel="+h(t,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_np(-4&t))}this.segment_is_null[e]=0,this.segment_limits[e]=s.effective_limit,this.segment_offsets[e]=s.base,this.sreg[e]=t}},CPU.prototype.load_tr=function(e){var t=this.lookup_segment_selector(e);if(dbg_assert(t.is_valid),!t.from_gdt)throw this.debug.unimpl("TR can only be loaded from GDT");if(t.is_null)throw dbg_log("#GP(0) | tried to load null selector (ltr)"),this.debug.unimpl("#GP handler");if(!t.is_system)throw dbg_log("#GP | ltr: not a system entry"),this.debug.unimpl("#GP handler (happens when running kvm-unit-test without ACPI)");if(9!==t.type&&1!==t.type)throw dbg_log("#GP | ltr: invalid type (type = "+h(t.type)+")"),this.debug.unimpl("#GP handler");if(!t.is_present)throw dbg_log("#NT | present bit not set (ltr)"),this.debug.unimpl("#NT handler");this.tss_size_32=9===t.type,this.segment_offsets[reg_tr]=t.base,this.segment_limits[reg_tr]=t.effective_limit,this.sreg[reg_tr]=e,this.write8(t.table_offset+5|0,2|this.read8(t.table_offset+5|0))},CPU.prototype.load_ldt=function(e){var t=this.lookup_segment_selector(e);if(t.is_null)this.segment_offsets[reg_ldtr]=0,this.segment_limits[reg_ldtr]=0;else{if(dbg_assert(t.is_valid),!t.from_gdt)throw this.debug.unimpl("LDTR can only be loaded from GDT");if(!t.is_present)throw dbg_log("lldt: present bit not set"),this.debug.unimpl("#GP handler");if(!t.is_system)throw dbg_log("lldt: not a system entry"),this.debug.unimpl("#GP handler");if(2!==t.type)throw dbg_log("lldt: invalid type ("+t.type+")"),this.debug.unimpl("#GP handler");this.segment_offsets[reg_ldtr]=t.base,this.segment_limits[reg_ldtr]=t.effective_limit,this.sreg[reg_ldtr]=e}},CPU.prototype.arpl=function(e,t){return this.flags_changed&=~flag_zero,(3&e)<(3&this.reg16[t])?(this.flags|=flag_zero,-4&e|3&this.reg16[t]):(this.flags&=~flag_zero,e)},CPU.prototype.lar=function(e,t){dbg_log("lar sel="+h(e,4),LOG_CPU);var s=this.lookup_segment_selector(e);this.flags_changed&=~flag_zero;var r=s.dpl<this.cpl||s.dpl<s.rpl;return s.is_null||!s.is_valid||(s.is_system?58817>>s.type&1||r:!s.is_conforming_executable&&r)?(this.flags&=~flag_zero,dbg_log("lar: invalid selector="+h(e,4)+" is_null="+s.is_null,LOG_CPU),t):(this.flags|=flag_zero,16776960&s.raw1)},CPU.prototype.lsl=function(e,t){dbg_log("lsl sel="+h(e,4),LOG_CPU);var s=this.lookup_segment_selector(e);this.flags_changed&=~flag_zero;var r=s.dpl<this.cpl||s.dpl<s.rpl;return s.is_null||!s.is_valid||(s.is_system?62833>>s.type&1||r:!s.is_conforming_executable&&r)?(this.flags&=~flag_zero,dbg_log("lsl: invalid selector="+h(e,4)+" is_null="+s.is_null,LOG_CPU),t):(this.flags|=flag_zero,0|s.effective_limit)},CPU.prototype.verr=function(e){var t=this.lookup_segment_selector(e);this.flags_changed&=~flag_zero,t.is_null||!t.is_valid||t.is_system||!t.is_readable||!t.is_conforming_executable&&(t.dpl<this.cpl||t.dpl<t.rpl)?(dbg_log("verr -> invalid. selector="+h(e,4),LOG_CPU),this.flags&=~flag_zero):(dbg_log("verr -> valid. selector="+h(e,4),LOG_CPU),this.flags|=flag_zero)},CPU.prototype.verw=function(e){var t=this.lookup_segment_selector(e);this.flags_changed&=~flag_zero,t.is_null||!t.is_valid||t.is_system||!t.is_writable||t.dpl<this.cpl||t.dpl<t.rpl?(dbg_log("verw invalid "+h(e)+" "+t.is_null+" "+!t.is_valid+" "+t.is_system+" "+!t.is_writable+" "+(t.dpl<this.cpl)+" "+(t.dpl<t.rpl)+" "+LOG_CPU),this.flags&=~flag_zero):(dbg_log("verw valid",LOG_CPU),this.flags|=flag_zero)},CPU.prototype.clear_tlb=function(){this.last_virt_esp=this.last_virt_eip=-1,this.tlb_info.set(this.tlb_info_global)},CPU.prototype.full_clear_tlb=function(){for(var e=new Int32Array(this.tlb_info_global.buffer),t=0;262144>t;)e[t++]=e[t++]=e[t++]=e[t++]=0;this.clear_tlb()},CPU.prototype.invlpg=function(e){e>>>=12,this.tlb_info[e]=0,this.tlb_info_global[e]=0,this.last_virt_esp=this.last_virt_eip=-1},CPU.prototype.translate_address_read=function(e){return this.paging?3===this.cpl?this.translate_address_user_read(e):this.translate_address_system_read(e):e},CPU.prototype.translate_address_write=function(e){return this.paging?3===this.cpl?this.translate_address_user_write(e):this.translate_address_system_write(e):e},CPU.prototype.translate_address_user_write=function(e){if(!this.paging)return e;var t=e>>>12;return this.tlb_info[t]&TLB_USER_WRITE?this.tlb_data[t]^e:this.do_page_translation(e,1,1)|4095&e},CPU.prototype.translate_address_user_read=function(e){if(!this.paging)return e;var t=e>>>12;return this.tlb_info[t]&TLB_USER_READ?this.tlb_data[t]^e:this.do_page_translation(e,0,1)|4095&e},CPU.prototype.translate_address_system_write=function(e){if(!this.paging)return e;var t=e>>>12;return this.tlb_info[t]&TLB_SYSTEM_WRITE?this.tlb_data[t]^e:this.do_page_translation(e,1,0)|4095&e},CPU.prototype.translate_address_system_read=function(e){if(!this.paging)return e;var t=e>>>12;return this.tlb_info[t]&TLB_SYSTEM_READ?this.tlb_data[t]^e:this.do_page_translation(e,0,0)|4095&e},CPU.prototype.do_page_translation=function(e,t,s){var r=e>>>12,i=(this.cr[3]>>>2)+(r>>10)|0,_=this.mem32s[i],a=!0,o=!0;if(dbg_assert(2147483648>e),1&_||(this.cr[2]=e,this.trigger_pagefault(t,s,0),dbg_assert(!1)),0==(2&_)&&(a=!1,t&&(s||this.cr[0]&CR0_WP)&&(this.cr[2]=e,this.trigger_pagefault(t,s,1),dbg_assert(!1))),0==(4&_)&&(o=!1,s&&(this.cr[2]=e,this.trigger_pagefault(t,s,1),dbg_assert(!1))),_&this.page_size_extensions)this.mem32s[i]=32|_|t<<6,e=4290772992&_|4190208&e,_&=256;else{var n=((4294963200&_)>>>2)+(1023&r)|0,d=this.mem32s[n];0==(1&d)&&(this.cr[2]=e,this.trigger_pagefault(t,s,0),dbg_assert(!1)),0==(2&d)&&(a=!1,t&&(s||this.cr[0]&CR0_WP)&&(this.cr[2]=e,this.trigger_pagefault(t,s,1),dbg_assert(!1))),0==(4&d)&&(o=!1,s&&(this.cr[2]=e,this.trigger_pagefault(t,s,1),dbg_assert(!1))),this.write_aligned32(i,32|_),this.write_aligned32(n,32|d|t<<6),e=4294963200&d,_=256&d}return this.tlb_data[r]=e^r<<12,a=o?a?TLB_SYSTEM_READ|TLB_SYSTEM_WRITE|TLB_USER_READ|TLB_USER_WRITE:TLB_SYSTEM_READ|TLB_USER_READ:a?TLB_SYSTEM_READ|TLB_SYSTEM_WRITE:TLB_SYSTEM_READ,this.tlb_info[r]=a,_&&this.cr[4]&CR4_PGE&&(this.tlb_info_global[r]=a),e},CPU.prototype.writable_or_pagefault=function(e,t){if(dbg_assert(4096>t,"not supported yet"),dbg_assert(0<t),this.paging){var s=3===this.cpl?1:0,r=s?TLB_USER_WRITE:TLB_SYSTEM_WRITE,i=e>>>12;0==(this.tlb_info[i]&r)&&this.do_page_translation(e,1,s),4096<=(4095&e)+t-1&&0==(this.tlb_info[i+1|0]&r)&&this.do_page_translation(e+t-1|0,1,s)}},CPU.prototype.trigger_pagefault=function(e,t,s){if(LOG_PAGE_FAULTS&&(dbg_log("page fault w="+e+" u="+t+" p="+s+" eip="+h(this.previous_ip>>>0,8)+" cr2="+h(this.cr[2]>>>0,8),LOG_CPU),dbg_trace(LOG_CPU)),this.page_fault)throw dbg_trace(LOG_CPU),this.debug.unimpl("Double fault");var r=this.cr[2]>>>12;throw this.tlb_info[r]=0,this.tlb_info_global[r]=0,this.instruction_pointer=this.previous_ip,this.page_fault=!0,this.call_interrupt_vector(14,!1,t<<2|e<<1|s),MAGIC_CPU_EXCEPTION},CPU.prototype.is_osize_32=function(){return this.is_32!==((this.prefixes&PREFIX_MASK_OPSIZE)===PREFIX_MASK_OPSIZE)},CPU.prototype.is_asize_32=function(){return this.is_32!==((this.prefixes&PREFIX_MASK_ADDRSIZE)===PREFIX_MASK_ADDRSIZE)},CPU.prototype.get_reg_asize=function(e){return dbg_assert(e===reg_ecx||e===reg_esi||e===reg_edi),e=this.reg32s[e],this.is_asize_32()?e:65535&e},CPU.prototype.set_ecx_asize=function(e){this.is_asize_32()?this.reg32s[reg_ecx]=e:this.reg16[reg_cx]=e},CPU.prototype.add_reg_asize=function(e,t){dbg_assert(e===reg_ecx||e===reg_esi||e===reg_edi),this.is_asize_32()?this.reg32s[e]+=t:this.reg16[e<<1]+=t},CPU.prototype.decr_ecx_asize=function(){return this.is_asize_32()?--this.reg32s[reg_ecx]:--this.reg16[reg_cx]},"undefined"!=typeof window?window.CPU=CPU:"undefined"!=typeof module&&void 0!==module.exports?module.exports.CPU=CPU:"function"==typeof importScripts&&(self.CPU=CPU),function(){CPU.prototype.modrm_table16=Array(192),CPU.prototype.modrm_table32=Array(192),CPU.prototype.sib_table=Array(256),CPU.prototype.modrm_table16[0]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_bx]+e.reg16[reg_si]&65535)|0},CPU.prototype.modrm_table16[64]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_bx]+e.reg16[reg_si]+e.read_disp8s()&65535)|0},CPU.prototype.modrm_table16[128]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_bx]+e.reg16[reg_si]+e.read_disp16()&65535)|0},CPU.prototype.modrm_table16[1]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_bx]+e.reg16[reg_di]&65535)|0},CPU.prototype.modrm_table16[65]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_bx]+e.reg16[reg_di]+e.read_disp8s()&65535)|0},CPU.prototype.modrm_table16[129]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_bx]+e.reg16[reg_di]+e.read_disp16()&65535)|0},CPU.prototype.modrm_table16[2]=function(e){return e.get_seg_prefix_ss()+(e.reg16[reg_bp]+e.reg16[reg_si]&65535)|0},CPU.prototype.modrm_table16[66]=function(e){return e.get_seg_prefix_ss()+(e.reg16[reg_bp]+e.reg16[reg_si]+e.read_disp8s()&65535)|0},CPU.prototype.modrm_table16[130]=function(e){return e.get_seg_prefix_ss()+(e.reg16[reg_bp]+e.reg16[reg_si]+e.read_disp16()&65535)|0},CPU.prototype.modrm_table16[3]=function(e){return e.get_seg_prefix_ss()+(e.reg16[reg_bp]+e.reg16[reg_di]&65535)|0},CPU.prototype.modrm_table16[67]=function(e){return e.get_seg_prefix_ss()+(e.reg16[reg_bp]+e.reg16[reg_di]+e.read_disp8s()&65535)|0},CPU.prototype.modrm_table16[131]=function(e){return e.get_seg_prefix_ss()+(e.reg16[reg_bp]+e.reg16[reg_di]+e.read_disp16()&65535)|0},CPU.prototype.modrm_table16[4]=function(e){return e.get_seg_prefix_ds()+(65535&e.reg16[reg_si])|0},CPU.prototype.modrm_table16[68]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_si]+e.read_disp8s()&65535)|0},CPU.prototype.modrm_table16[132]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_si]+e.read_disp16()&65535)|0},CPU.prototype.modrm_table16[5]=function(e){return e.get_seg_prefix_ds()+(65535&e.reg16[reg_di])|0},CPU.prototype.modrm_table16[69]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_di]+e.read_disp8s()&65535)|0},CPU.prototype.modrm_table16[133]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_di]+e.read_disp16()&65535)|0},CPU.prototype.modrm_table16[6]=function(e){return e.get_seg_prefix_ss()+(65535&e.reg16[reg_bp])|0},CPU.prototype.modrm_table16[70]=function(e){return e.get_seg_prefix_ss()+(e.reg16[reg_bp]+e.read_disp8s()&65535)|0},CPU.prototype.modrm_table16[134]=function(e){return e.get_seg_prefix_ss()+(e.reg16[reg_bp]+e.read_disp16()&65535)|0},CPU.prototype.modrm_table16[7]=function(e){return e.get_seg_prefix_ds()+(65535&e.reg16[reg_bx])|0},CPU.prototype.modrm_table16[71]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_bx]+e.read_disp8s()&65535)|0},CPU.prototype.modrm_table16[135]=function(e){return e.get_seg_prefix_ds()+(e.reg16[reg_bx]+e.read_disp16()&65535)|0},CPU.prototype.modrm_table32[0]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.modrm_table32[64]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_eax]+e.read_disp8s()|0},CPU.prototype.modrm_table32[128]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_eax]+e.read_disp32s()|0},CPU.prototype.modrm_table32[1]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.modrm_table32[65]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_ecx]+e.read_disp8s()|0},CPU.prototype.modrm_table32[129]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_ecx]+e.read_disp32s()|0},CPU.prototype.modrm_table32[2]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.modrm_table32[66]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_edx]+e.read_disp8s()|0},CPU.prototype.modrm_table32[130]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_edx]+e.read_disp32s()|0},CPU.prototype.modrm_table32[3]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.modrm_table32[67]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_ebx]+e.read_disp8s()|0},CPU.prototype.modrm_table32[131]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_ebx]+e.read_disp32s()|0},CPU.prototype.modrm_table32[5]=function(e){return e.get_seg_prefix_ss()+e.reg32s[reg_ebp]|0},CPU.prototype.modrm_table32[69]=function(e){return e.get_seg_prefix_ss()+e.reg32s[reg_ebp]+e.read_disp8s()|0},CPU.prototype.modrm_table32[133]=function(e){return e.get_seg_prefix_ss()+e.reg32s[reg_ebp]+e.read_disp32s()|0},CPU.prototype.modrm_table32[6]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.modrm_table32[70]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_esi]+e.read_disp8s()|0},CPU.prototype.modrm_table32[134]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_esi]+e.read_disp32s()|0},CPU.prototype.modrm_table32[7]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.modrm_table32[71]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_edi]+e.read_disp8s()|0},CPU.prototype.modrm_table32[135]=function(e){return e.get_seg_prefix_ds()+e.reg32s[reg_edi]+e.read_disp32s()|0},CPU.prototype.modrm_table16[6]=function(e){return e.get_seg_prefix_ds()+e.read_disp16()|0},CPU.prototype.modrm_table32[5]=function(e){return e.get_seg_prefix_ds()+e.read_disp32s()|0},CPU.prototype.modrm_table32[4]=function(e){return 0|e.sib_resolve(!1)},CPU.prototype.modrm_table32[68]=function(e){return e.sib_resolve(!0)+e.read_disp8s()|0},CPU.prototype.modrm_table32[132]=function(e){return e.sib_resolve(!0)+e.read_disp32s()|0};for(var e=0;8>e;e++)for(var t=0;3>t;t++)for(var s=e|t<<6,r=1;8>r;r++)CPU.prototype.modrm_table32[s|r<<3]=CPU.prototype.modrm_table32[s],CPU.prototype.modrm_table16[s|r<<3]=CPU.prototype.modrm_table16[s];CPU.prototype.sib_table[0]=function(e,t){return e.reg32s[reg_eax]+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[1]=function(e,t){return e.reg32s[reg_eax]+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[2]=function(e,t){return e.reg32s[reg_eax]+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[3]=function(e,t){return e.reg32s[reg_eax]+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[4]=function(e,t){return e.reg32s[reg_eax]+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[5]=function(e,t){return e.reg32s[reg_eax]+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[6]=function(e,t){return e.reg32s[reg_eax]+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[7]=function(e,t){return e.reg32s[reg_eax]+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[64]=function(e,t){return(e.reg32s[reg_eax]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[65]=function(e,t){return(e.reg32s[reg_eax]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[66]=function(e,t){return(e.reg32s[reg_eax]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[67]=function(e,t){return(e.reg32s[reg_eax]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[68]=function(e,t){return(e.reg32s[reg_eax]<<1)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[69]=function(e,t){return(e.reg32s[reg_eax]<<1)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[70]=function(e,t){return(e.reg32s[reg_eax]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[71]=function(e,t){return(e.reg32s[reg_eax]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[128]=function(e,t){return(e.reg32s[reg_eax]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[129]=function(e,t){return(e.reg32s[reg_eax]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[130]=function(e,t){return(e.reg32s[reg_eax]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[131]=function(e,t){return(e.reg32s[reg_eax]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[132]=function(e,t){return(e.reg32s[reg_eax]<<2)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[133]=function(e,t){return(e.reg32s[reg_eax]<<2)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[134]=function(e,t){return(e.reg32s[reg_eax]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[135]=function(e,t){return(e.reg32s[reg_eax]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[192]=function(e,t){return(e.reg32s[reg_eax]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[193]=function(e,t){return(e.reg32s[reg_eax]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[194]=function(e,t){return(e.reg32s[reg_eax]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[195]=function(e,t){return(e.reg32s[reg_eax]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[196]=function(e,t){return(e.reg32s[reg_eax]<<3)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[197]=function(e,t){return(e.reg32s[reg_eax]<<3)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[198]=function(e,t){return(e.reg32s[reg_eax]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[199]=function(e,t){return(e.reg32s[reg_eax]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[8]=function(e,t){return e.reg32s[reg_ecx]+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[9]=function(e,t){return e.reg32s[reg_ecx]+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[10]=function(e,t){return e.reg32s[reg_ecx]+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[11]=function(e,t){return e.reg32s[reg_ecx]+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[12]=function(e,t){return e.reg32s[reg_ecx]+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[13]=function(e,t){return e.reg32s[reg_ecx]+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[14]=function(e,t){return e.reg32s[reg_ecx]+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[15]=function(e,t){return e.reg32s[reg_ecx]+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[72]=function(e,t){return(e.reg32s[reg_ecx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[73]=function(e,t){return(e.reg32s[reg_ecx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[74]=function(e,t){return(e.reg32s[reg_ecx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[75]=function(e,t){return(e.reg32s[reg_ecx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[76]=function(e,t){return(e.reg32s[reg_ecx]<<1)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[77]=function(e,t){return(e.reg32s[reg_ecx]<<1)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[78]=function(e,t){return(e.reg32s[reg_ecx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[79]=function(e,t){return(e.reg32s[reg_ecx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[136]=function(e,t){return(e.reg32s[reg_ecx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[137]=function(e,t){return(e.reg32s[reg_ecx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[138]=function(e,t){return(e.reg32s[reg_ecx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[139]=function(e,t){return(e.reg32s[reg_ecx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[140]=function(e,t){return(e.reg32s[reg_ecx]<<2)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[141]=function(e,t){return(e.reg32s[reg_ecx]<<2)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[142]=function(e,t){return(e.reg32s[reg_ecx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[143]=function(e,t){return(e.reg32s[reg_ecx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[200]=function(e,t){return(e.reg32s[reg_ecx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[201]=function(e,t){return(e.reg32s[reg_ecx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[202]=function(e,t){return(e.reg32s[reg_ecx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[203]=function(e,t){return(e.reg32s[reg_ecx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[204]=function(e,t){return(e.reg32s[reg_ecx]<<3)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[205]=function(e,t){return(e.reg32s[reg_ecx]<<3)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[206]=function(e,t){return(e.reg32s[reg_ecx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[207]=function(e,t){return(e.reg32s[reg_ecx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[16]=function(e,t){return e.reg32s[reg_edx]+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[17]=function(e,t){return e.reg32s[reg_edx]+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[18]=function(e,t){return e.reg32s[reg_edx]+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[19]=function(e,t){return e.reg32s[reg_edx]+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[20]=function(e,t){return e.reg32s[reg_edx]+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[21]=function(e,t){return e.reg32s[reg_edx]+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[22]=function(e,t){return e.reg32s[reg_edx]+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[23]=function(e,t){return e.reg32s[reg_edx]+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[80]=function(e,t){return(e.reg32s[reg_edx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[81]=function(e,t){return(e.reg32s[reg_edx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[82]=function(e,t){return(e.reg32s[reg_edx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[83]=function(e,t){return(e.reg32s[reg_edx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[84]=function(e,t){return(e.reg32s[reg_edx]<<1)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[85]=function(e,t){return(e.reg32s[reg_edx]<<1)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[86]=function(e,t){return(e.reg32s[reg_edx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[87]=function(e,t){return(e.reg32s[reg_edx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[144]=function(e,t){return(e.reg32s[reg_edx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[145]=function(e,t){return(e.reg32s[reg_edx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[146]=function(e,t){return(e.reg32s[reg_edx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[147]=function(e,t){return(e.reg32s[reg_edx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[148]=function(e,t){return(e.reg32s[reg_edx]<<2)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[149]=function(e,t){return(e.reg32s[reg_edx]<<2)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[150]=function(e,t){return(e.reg32s[reg_edx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[151]=function(e,t){return(e.reg32s[reg_edx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[208]=function(e,t){return(e.reg32s[reg_edx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[209]=function(e,t){return(e.reg32s[reg_edx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[210]=function(e,t){return(e.reg32s[reg_edx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[211]=function(e,t){return(e.reg32s[reg_edx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[212]=function(e,t){return(e.reg32s[reg_edx]<<3)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[213]=function(e,t){return(e.reg32s[reg_edx]<<3)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[214]=function(e,t){return(e.reg32s[reg_edx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[215]=function(e,t){return(e.reg32s[reg_edx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[24]=function(e,t){return e.reg32s[reg_ebx]+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[25]=function(e,t){return e.reg32s[reg_ebx]+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[26]=function(e,t){return e.reg32s[reg_ebx]+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[27]=function(e,t){return e.reg32s[reg_ebx]+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[28]=function(e,t){return e.reg32s[reg_ebx]+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[29]=function(e,t){return e.reg32s[reg_ebx]+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[30]=function(e,t){return e.reg32s[reg_ebx]+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[31]=function(e,t){return e.reg32s[reg_ebx]+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[88]=function(e,t){return(e.reg32s[reg_ebx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[89]=function(e,t){return(e.reg32s[reg_ebx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[90]=function(e,t){return(e.reg32s[reg_ebx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[91]=function(e,t){return(e.reg32s[reg_ebx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[92]=function(e,t){return(e.reg32s[reg_ebx]<<1)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[93]=function(e,t){return(e.reg32s[reg_ebx]<<1)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[94]=function(e,t){return(e.reg32s[reg_ebx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[95]=function(e,t){return(e.reg32s[reg_ebx]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[152]=function(e,t){return(e.reg32s[reg_ebx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[153]=function(e,t){return(e.reg32s[reg_ebx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[154]=function(e,t){return(e.reg32s[reg_ebx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[155]=function(e,t){return(e.reg32s[reg_ebx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[156]=function(e,t){return(e.reg32s[reg_ebx]<<2)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[157]=function(e,t){return(e.reg32s[reg_ebx]<<2)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[158]=function(e,t){return(e.reg32s[reg_ebx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[159]=function(e,t){return(e.reg32s[reg_ebx]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[216]=function(e,t){return(e.reg32s[reg_ebx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[217]=function(e,t){return(e.reg32s[reg_ebx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[218]=function(e,t){return(e.reg32s[reg_ebx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[219]=function(e,t){return(e.reg32s[reg_ebx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[220]=function(e,t){return(e.reg32s[reg_ebx]<<3)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[221]=function(e,t){return(e.reg32s[reg_ebx]<<3)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[222]=function(e,t){return(e.reg32s[reg_ebx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[223]=function(e,t){return(e.reg32s[reg_ebx]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[32]=function(e,t){
return e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[33]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[34]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[35]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[36]=function(e,t){return e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[37]=function(e,t){return 0|(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())},CPU.prototype.sib_table[38]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[39]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[96]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[97]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[98]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[99]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[100]=function(e,t){return e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[101]=function(e,t){return 0|(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())},CPU.prototype.sib_table[102]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[103]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[160]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[161]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[162]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[163]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[164]=function(e,t){return e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[165]=function(e,t){return 0|(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())},CPU.prototype.sib_table[166]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[167]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[224]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[225]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[226]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[227]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[228]=function(e,t){return e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[229]=function(e,t){return 0|(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())},CPU.prototype.sib_table[230]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[231]=function(e,t){return e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[40]=function(e,t){return e.reg32s[reg_ebp]+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[41]=function(e,t){return e.reg32s[reg_ebp]+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[42]=function(e,t){return e.reg32s[reg_ebp]+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[43]=function(e,t){return e.reg32s[reg_ebp]+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[44]=function(e,t){return e.reg32s[reg_ebp]+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[45]=function(e,t){return e.reg32s[reg_ebp]+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[46]=function(e,t){return e.reg32s[reg_ebp]+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[47]=function(e,t){return e.reg32s[reg_ebp]+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[104]=function(e,t){return(e.reg32s[reg_ebp]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[105]=function(e,t){return(e.reg32s[reg_ebp]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[106]=function(e,t){return(e.reg32s[reg_ebp]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[107]=function(e,t){return(e.reg32s[reg_ebp]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[108]=function(e,t){return(e.reg32s[reg_ebp]<<1)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[109]=function(e,t){return(e.reg32s[reg_ebp]<<1)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[110]=function(e,t){return(e.reg32s[reg_ebp]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[111]=function(e,t){return(e.reg32s[reg_ebp]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[168]=function(e,t){return(e.reg32s[reg_ebp]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[169]=function(e,t){return(e.reg32s[reg_ebp]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[170]=function(e,t){return(e.reg32s[reg_ebp]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[171]=function(e,t){return(e.reg32s[reg_ebp]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[172]=function(e,t){return(e.reg32s[reg_ebp]<<2)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[173]=function(e,t){return(e.reg32s[reg_ebp]<<2)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[174]=function(e,t){return(e.reg32s[reg_ebp]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[175]=function(e,t){return(e.reg32s[reg_ebp]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[232]=function(e,t){return(e.reg32s[reg_ebp]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[233]=function(e,t){return(e.reg32s[reg_ebp]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[234]=function(e,t){return(e.reg32s[reg_ebp]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[235]=function(e,t){return(e.reg32s[reg_ebp]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[236]=function(e,t){return(e.reg32s[reg_ebp]<<3)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[237]=function(e,t){return(e.reg32s[reg_ebp]<<3)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[238]=function(e,t){return(e.reg32s[reg_ebp]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[239]=function(e,t){return(e.reg32s[reg_ebp]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[48]=function(e,t){return e.reg32s[reg_esi]+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[49]=function(e,t){return e.reg32s[reg_esi]+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[50]=function(e,t){return e.reg32s[reg_esi]+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[51]=function(e,t){return e.reg32s[reg_esi]+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[52]=function(e,t){return e.reg32s[reg_esi]+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[53]=function(e,t){return e.reg32s[reg_esi]+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[54]=function(e,t){return e.reg32s[reg_esi]+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[55]=function(e,t){return e.reg32s[reg_esi]+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0};CPU.prototype.sib_table[112]=function(e,t){return(e.reg32s[reg_esi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[113]=function(e,t){return(e.reg32s[reg_esi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[114]=function(e,t){return(e.reg32s[reg_esi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[115]=function(e,t){return(e.reg32s[reg_esi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[116]=function(e,t){return(e.reg32s[reg_esi]<<1)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[117]=function(e,t){return(e.reg32s[reg_esi]<<1)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[118]=function(e,t){return(e.reg32s[reg_esi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[119]=function(e,t){return(e.reg32s[reg_esi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[176]=function(e,t){return(e.reg32s[reg_esi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[177]=function(e,t){return(e.reg32s[reg_esi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[178]=function(e,t){return(e.reg32s[reg_esi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[179]=function(e,t){return(e.reg32s[reg_esi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[180]=function(e,t){return(e.reg32s[reg_esi]<<2)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[181]=function(e,t){return(e.reg32s[reg_esi]<<2)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[182]=function(e,t){return(e.reg32s[reg_esi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[183]=function(e,t){return(e.reg32s[reg_esi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[240]=function(e,t){return(e.reg32s[reg_esi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[241]=function(e,t){return(e.reg32s[reg_esi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[242]=function(e,t){return(e.reg32s[reg_esi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[243]=function(e,t){return(e.reg32s[reg_esi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[244]=function(e,t){return(e.reg32s[reg_esi]<<3)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[245]=function(e,t){return(e.reg32s[reg_esi]<<3)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[246]=function(e,t){return(e.reg32s[reg_esi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[247]=function(e,t){return(e.reg32s[reg_esi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[56]=function(e,t){return e.reg32s[reg_edi]+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[57]=function(e,t){return e.reg32s[reg_edi]+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[58]=function(e,t){return e.reg32s[reg_edi]+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[59]=function(e,t){return e.reg32s[reg_edi]+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[60]=function(e,t){return e.reg32s[reg_edi]+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[61]=function(e,t){return e.reg32s[reg_edi]+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[62]=function(e,t){return e.reg32s[reg_edi]+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[63]=function(e,t){return e.reg32s[reg_edi]+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[120]=function(e,t){return(e.reg32s[reg_edi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[121]=function(e,t){return(e.reg32s[reg_edi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[122]=function(e,t){return(e.reg32s[reg_edi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[123]=function(e,t){return(e.reg32s[reg_edi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[124]=function(e,t){return(e.reg32s[reg_edi]<<1)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[125]=function(e,t){return(e.reg32s[reg_edi]<<1)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[126]=function(e,t){return(e.reg32s[reg_edi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[127]=function(e,t){return(e.reg32s[reg_edi]<<1)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[184]=function(e,t){return(e.reg32s[reg_edi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[185]=function(e,t){return(e.reg32s[reg_edi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[186]=function(e,t){return(e.reg32s[reg_edi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[187]=function(e,t){return(e.reg32s[reg_edi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[188]=function(e,t){return(e.reg32s[reg_edi]<<2)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[189]=function(e,t){return(e.reg32s[reg_edi]<<2)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[190]=function(e,t){return(e.reg32s[reg_edi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[191]=function(e,t){return(e.reg32s[reg_edi]<<2)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0},CPU.prototype.sib_table[248]=function(e,t){return(e.reg32s[reg_edi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_eax]|0},CPU.prototype.sib_table[249]=function(e,t){return(e.reg32s[reg_edi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ecx]|0},CPU.prototype.sib_table[250]=function(e,t){return(e.reg32s[reg_edi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edx]|0},CPU.prototype.sib_table[251]=function(e,t){return(e.reg32s[reg_edi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_ebx]|0},CPU.prototype.sib_table[252]=function(e,t){return(e.reg32s[reg_edi]<<3)+e.get_seg_prefix_ss()+e.reg32s[reg_esp]|0},CPU.prototype.sib_table[253]=function(e,t){return(e.reg32s[reg_edi]<<3)+(t?e.get_seg_prefix_ss()+e.reg32s[reg_ebp]:e.get_seg_prefix_ds()+e.read_disp32s())|0},CPU.prototype.sib_table[254]=function(e,t){return(e.reg32s[reg_edi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_esi]|0},CPU.prototype.sib_table[255]=function(e,t){return(e.reg32s[reg_edi]<<3)+e.get_seg_prefix_ds()+e.reg32s[reg_edi]|0}}();var MAX_COUNT_PER_CYCLE=4096;CPU.prototype.movsb=function(){var e=this.get_seg_prefix(reg_ds)+this.get_reg_asize(reg_esi)|0,t=this.get_seg(reg_es)+this.get_reg_asize(reg_edi)|0,s=this.flags&flag_direction?-1:1;if(this.prefixes&PREFIX_MASK_REP){var r=this.get_reg_asize(reg_ecx)>>>0;if(0===r)return;var i=r,_=MAX_COUNT_PER_CYCLE,a=this.translate_address_read(e),o=this.translate_address_write(t);this.paging&&(_=string_get_cycle_count2(s,e,t));do{this.write8(o,this.read8(a)),o+=s,a+=s,e=0!=--r}while(e&&_--);s=s*(i-r)|0,this.add_reg_asize(reg_edi,s),this.add_reg_asize(reg_esi,s),this.set_ecx_asize(r),this.timestamp_counter+=i-r,e&&(this.instruction_pointer=this.previous_ip)}else this.safe_write8(t,this.safe_read8(e)),this.add_reg_asize(reg_edi,s),this.add_reg_asize(reg_esi,s);this.diverged()},CPU.prototype.movsw=function(){var e=this.get_seg_prefix(reg_ds)+this.get_reg_asize(reg_esi)|0,t=this.get_seg(reg_es)+this.get_reg_asize(reg_edi)|0,s=this.flags&flag_direction?-2:2;if(this.prefixes&PREFIX_MASK_REP){var r=this.get_reg_asize(reg_ecx)>>>0;if(0===r)return;var i=r,_=MAX_COUNT_PER_CYCLE;if(1&t||1&e)do{this.safe_write16(t,this.safe_read16(e)),t+=s,this.add_reg_asize(reg_edi,s),e+=s,this.add_reg_asize(reg_esi,s);var a=0!==this.decr_ecx_asize()}while(a&&_--);else{var o=0>s?-1:1,n=this.translate_address_read(e)>>>1,d=this.translate_address_write(t)>>>1;this.paging&&(_=string_get_cycle_count2(s,e,t));do{this.write_aligned16(d,this.read_aligned16(n)),d+=o,n+=o,a=0!=--r}while(a&&_--);e=s*(i-r)|0,this.add_reg_asize(reg_edi,e),this.add_reg_asize(reg_esi,e),this.set_ecx_asize(r),this.timestamp_counter+=i-r}a&&(this.instruction_pointer=this.previous_ip)}else this.safe_write16(t,this.safe_read16(e)),this.add_reg_asize(reg_edi,s),this.add_reg_asize(reg_esi,s);this.diverged()},CPU.prototype.movsd=function(){if(this.prefixes&PREFIX_MASK_REP){var e=this.get_seg_prefix(reg_ds)+this.get_reg_asize(reg_esi)|0,t=this.get_seg(reg_es)+this.get_reg_asize(reg_edi)|0,s=this.get_reg_asize(reg_ecx)>>>0;if(!s)return;var r=this.paging?4095:3;if(0==(t&r)&&0==(e&r)&&0==(this.flags&flag_direction)&&(r=!1,this.paging&&(e=this.translate_address_read(e),t=this.translate_address_write(t),1024<s&&(s=1024,r=!0)),!this.io.in_mmap_range(e,s)&&!this.io.in_mmap_range(t,s))){var i=s<<2;return this.add_reg_asize(reg_ecx,-s),this.add_reg_asize(reg_edi,i),this.add_reg_asize(reg_esi,i),t>>>=2,e>>>=2,this.write_blob32(this.mem32s.subarray(e,e+s),t),void(r&&(this.instruction_pointer=this.previous_ip))}}if(e=this.get_seg_prefix(reg_ds)+this.get_reg_asize(reg_esi)|0,t=this.get_seg(reg_es)+this.get_reg_asize(reg_edi)|0,i=this.flags&flag_direction?-4:4,this.prefixes&PREFIX_MASK_REP){if(0===(s=this.get_reg_asize(reg_ecx)>>>0))return;var _=s,a=MAX_COUNT_PER_CYCLE;if(3&t||3&e)do{this.safe_write32(t,this.safe_read32s(e)),t+=i,this.add_reg_asize(reg_edi,i),e+=i,this.add_reg_asize(reg_esi,i),r=0!==this.decr_ecx_asize()}while(r&&a--);else{var o=0>i?-1:1,n=this.translate_address_read(e)>>>2,d=this.translate_address_write(t)>>>2;this.paging&&(a=string_get_cycle_count2(i,e,t));do{this.write_aligned32(d,this.read_aligned32(n)),d+=o,n+=o,r=0!=--s}while(r&&a--);i=i*(_-s)|0,this.add_reg_asize(reg_edi,i),this.add_reg_asize(reg_esi,i),this.set_ecx_asize(s),this.timestamp_counter+=_-s}r&&(this.instruction_pointer=this.previous_ip)}else this.safe_write32(t,this.safe_read32s(e)),this.add_reg_asize(reg_edi,i),this.add_reg_asize(reg_esi,i);this.diverged()},CPU.prototype.add8=function(e,t){return this.add(e,t,OPSIZE_8)},CPU.prototype.add16=function(e,t){return this.add(e,t,OPSIZE_16)},CPU.prototype.add32=function(e,t){return this.add(e,t,OPSIZE_32)},CPU.prototype.adc8=function(e,t){return this.adc(e,t,OPSIZE_8)},CPU.prototype.adc16=function(e,t){return this.adc(e,t,OPSIZE_16)},CPU.prototype.adc32=function(e,t){return this.adc(e,t,OPSIZE_32)},CPU.prototype.sub8=function(e,t){return this.sub(e,t,OPSIZE_8)},CPU.prototype.sub16=function(e,t){return this.sub(e,t,OPSIZE_16)},CPU.prototype.sub32=function(e,t){return this.sub(e,t,OPSIZE_32)},CPU.prototype.cmp8=function(e,t){return this.sub(e,t,OPSIZE_8)},CPU.prototype.cmp16=function(e,t){return this.sub(e,t,OPSIZE_16)},CPU.prototype.cmp32=function(e,t){return this.sub(e,t,OPSIZE_32)},CPU.prototype.sbb8=function(e,t){return this.sbb(e,t,OPSIZE_8)},CPU.prototype.sbb16=function(e,t){return this.sbb(e,t,OPSIZE_16)},CPU.prototype.sbb32=function(e,t){return this.sbb(e,t,OPSIZE_32)},CPU.prototype.add=function(e,t,s){return this.last_op1=e,this.last_op2=t,this.last_add_result=this.last_result=e+t|0,this.last_op_size=s,this.flags_changed=flags_all,this.last_result},CPU.prototype.adc=function(e,t,s){var r=this.getcf();return this.last_op1=e,this.last_op2=t,this.last_add_result=this.last_result=(e+t|0)+r|0,this.last_op_size=s,this.flags_changed=flags_all,this.last_result},CPU.prototype.sub=function(e,t,s){return this.last_add_result=e,this.last_op2=t,this.last_op1=this.last_result=e-t|0,this.last_op_size=s,this.flags_changed=flags_all,this.last_result},CPU.prototype.sbb=function(e,t,s){var r=this.getcf();return this.last_add_result=e,this.last_op2=t,this.last_op1=this.last_result=e-t-r|0,this.last_op_size=s,this.flags_changed=flags_all,this.last_result},CPU.prototype.inc8=function(e){return this.inc(e,OPSIZE_8)},CPU.prototype.inc16=function(e){return this.inc(e,OPSIZE_16)},CPU.prototype.inc32=function(e){return this.inc(e,OPSIZE_32)},CPU.prototype.dec8=function(e){return this.dec(e,OPSIZE_8)},CPU.prototype.dec16=function(e){return this.dec(e,OPSIZE_16)},CPU.prototype.dec32=function(e){return this.dec(e,OPSIZE_32)},CPU.prototype.inc=function(e,t){return this.flags=-2&this.flags|this.getcf(),this.last_op1=e,this.last_op2=1,this.last_add_result=this.last_result=e+1|0,this.last_op_size=t,this.flags_changed=-2&flags_all,this.last_result},CPU.prototype.dec=function(e,t){return this.flags=-2&this.flags|this.getcf(),this.last_add_result=e,this.last_op2=1,this.last_op1=this.last_result=e-1|0,this.last_op_size=t,this.flags_changed=-2&flags_all,this.last_result},CPU.prototype.neg8=function(e){return this.neg(e,OPSIZE_8)},CPU.prototype.neg16=function(e){return this.neg(e,OPSIZE_16)},CPU.prototype.neg32=function(e){return this.neg(e,OPSIZE_32)},CPU.prototype.neg=function(e,t){return this.last_op1=this.last_result=0|-e,this.flags_changed=flags_all,this.last_add_result=0,this.last_op2=e,this.last_op_size=t,this.last_result},CPU.prototype.mul8=function(e){e*=this.reg8[reg_al],this.reg16[reg_ax]=e,this.last_result=255&e,this.last_op_size=OPSIZE_8,this.flags=256>e?-2&this.flags&~flag_overflow:1|this.flags|flag_overflow,this.flags_changed=-2&flags_all&~flag_overflow},CPU.prototype.imul8=function(e){e*=this.reg8s[reg_al],this.reg16[reg_ax]=e,this.last_result=255&e,this.last_op_size=OPSIZE_8,this.flags=127<e||-128>e?1|this.flags|flag_overflow:-2&this.flags&~flag_overflow,this.flags_changed=-2&flags_all&~flag_overflow},CPU.prototype.mul16=function(e){e*=this.reg16[reg_ax];var t=e>>>16;this.reg16[reg_ax]=e,this.reg16[reg_dx]=t,this.last_result=65535&e,this.last_op_size=OPSIZE_16,this.flags=0===t?-2&this.flags&~flag_overflow:1|this.flags|flag_overflow,this.flags_changed=-2&flags_all&~flag_overflow},CPU.prototype.imul16=function(e){e*=this.reg16s[reg_ax],this.reg16[reg_ax]=e,this.reg16[reg_dx]=e>>16,this.last_result=65535&e,this.last_op_size=OPSIZE_16,this.flags=32767<e||-32768>e?1|this.flags|flag_overflow:-2&this.flags&~flag_overflow,this.flags_changed=-2&flags_all&~flag_overflow},CPU.prototype.imul_reg16=function(e,t){return dbg_assert(32768>e&&-32768<=e),dbg_assert(32768>t&&-32768<=t),e*=t,this.last_result=65535&e,this.last_op_size=OPSIZE_16,this.flags=32767<e||-32768>e?1|this.flags|flag_overflow:-2&this.flags&~flag_overflow,this.flags_changed=-2&flags_all&~flag_overflow,e},CPU.prototype.do_mul32=function(e,t){var s=65535&e;e>>>=16;var r=65535&t;t>>>=16;var i=s*r;r=(i>>>16)+(e*r|0)|0;var _=r>>>16;return r=(65535&r)+(s*t|0)|0,this.mul32_result[0]=r<<16|65535&i,this.mul32_result[1]=((r>>>16)+(e*t|0)|0)+_|0,this.mul32_result},CPU.prototype.do_imul32=function(e,t){var s=!1;return 0>e&&(s=!0,e=0|-e),0>t&&(s=!s,t=0|-t),e=this.do_mul32(e,t),s&&(e[0]=0|-e[0],e[1]=~e[1]+!e[0]|0),e},CPU.prototype.mul32=function(e){e=this.do_mul32(this.reg32s[reg_eax],e),this.reg32s[reg_eax]=e[0],this.reg32s[reg_edx]=e[1],this.last_result=e[0],this.last_op_size=OPSIZE_32,this.flags=0===e[1]?-2&this.flags&~flag_overflow:1|this.flags|flag_overflow,this.flags_changed=-2&flags_all&~flag_overflow},CPU.prototype.imul32=function(e){dbg_assert(2147483648>e&&-2147483648<=e),e=this.do_imul32(this.reg32s[reg_eax],e),this.reg32s[reg_eax]=e[0],this.reg32s[reg_edx]=e[1],this.last_result=e[0],this.last_op_size=OPSIZE_32,this.flags=e[1]===e[0]>>31?-2&this.flags&~flag_overflow:1|this.flags|flag_overflow,this.flags_changed=-2&flags_all&~flag_overflow},CPU.prototype.imul_reg32=function(e,t){return dbg_assert(2147483648>e&&-2147483648<=e),dbg_assert(2147483648>t&&-2147483648<=t),e=this.do_imul32(e,t),this.last_result=e[0],this.last_op_size=OPSIZE_32,this.flags=e[1]===e[0]>>31?-2&this.flags&~flag_overflow:1|this.flags|flag_overflow,this.flags_changed=-2&flags_all&~flag_overflow,e[0]},CPU.prototype.div8=function(e){if(dbg_assert(0<=e&&256>e),0===e)this.trigger_de();else{var t=this.reg16[reg_ax],s=t/e|0;256<=s?this.trigger_de():(this.reg8[reg_al]=s,this.reg8[reg_ah]=t%e)}},CPU.prototype.idiv8=function(e){if(dbg_assert(-128<=e&&128>e),0===e)this.trigger_de();else{var t=this.reg16s[reg_ax],s=t/e|0;128<=s||-129>=s?this.trigger_de():(this.reg8[reg_al]=s,this.reg8[reg_ah]=t%e)}},CPU.prototype.div16=function(e){if(dbg_assert(0<=e&&65536>e),0===e)this.trigger_de();else{var t=(this.reg16[reg_ax]|this.reg16[reg_dx]<<16)>>>0,s=t/e|0;65536<=s||0>s?this.trigger_de():(this.reg16[reg_ax]=s,this.reg16[reg_dx]=t%e)}},CPU.prototype.idiv16=function(e){if(dbg_assert(-32768<=e&&32768>e),0===e)this.trigger_de();else{var t=this.reg16[reg_ax]|this.reg16[reg_dx]<<16,s=t/e|0;32768<=s||-32769>=s?this.trigger_de():(this.reg16[reg_ax]=s,this.reg16[reg_dx]=t%e)}},CPU.prototype.do_div32=function(e,t,s){(t>=s||0===s)&&(dbg_log("div32 #DE: "+h(t,8)+":"+h(e,8)+" div "+h(s,8)),this.trigger_de());var r=0;if(1048576<t){for(var i=32,_=s;_>t;)_>>>=1,i--;for(;1048576<t;){if(t>=_){t-=_;var a=s<<i>>>0;a>e&&t--,e=e-a>>>0,r|=1<<i}i--,_>>=1}r>>>=0}return e+=4294967296*t,this.div32_result[0]=r+(e/s|0),this.div32_result[1]=e%s,this.div32_result},CPU.prototype.div32=function(e){dbg_assert(0<=e&&4294967295>=e);var t=this.reg32[reg_eax],s=this.reg32[reg_edx],r=this.do_div32(t,s,e),i=r[0];r=r[1],dbg_assert(e),4294967296<=i?(dbg_log("div32 #DE: "+h(s,8)+":"+h(t,8)+" div "+h(e,8)),dbg_log("-> "+h(i)),this.trigger_de()):(this.reg32s[reg_eax]=i,this.reg32s[reg_edx]=r)},CPU.prototype.idiv32=function(e){dbg_assert(2147483648>e&&-2147483648<=e);var t=this.reg32[reg_eax],s=this.reg32s[reg_edx],r=!1,i=!1;0>e&&(i=!0,e=-e),0>s&&(r=!0,i=!i,t=-t>>>0,s=~s+!t);var _=this.do_div32(t,s,e),a=_[0];_=_[1],i&&(a=0|-a),r&&(_=0|-_),dbg_assert(e),2147483648<=a||-2147483649>=a?(dbg_log("div32 #DE: "+h(s,8)+":"+h(t,8)+" div "+h(e,8)),dbg_log("-> "+h(a)),this.trigger_de()):(this.reg32s[reg_eax]=a,this.reg32s[reg_edx]=_)},CPU.prototype.xadd8=function(e,t){var s=this.reg8[t];return this.reg8[t]=e,this.add(e,s,OPSIZE_8)},CPU.prototype.xadd16=function(e,t){var s=this.reg16[t];return this.reg16[t]=e,this.add(e,s,OPSIZE_16)},CPU.prototype.xadd32=function(e,t){var s=this.reg32s[t];return this.reg32s[t]=e,this.add(e,s,OPSIZE_32)},CPU.prototype.bcd_daa=function(){var e=this.reg8[reg_al],t=this.getcf(),s=this.getaf();this.flags=-2&this.flags&~flag_adjust,(9<(15&e)||s)&&(this.reg8[reg_al]+=6,this.flags|=flag_adjust),(153<e||t)&&(this.reg8[reg_al]+=96,this.flags|=1),this.last_result=this.reg8[reg_al],this.last_op_size=OPSIZE_8,this.last_op1=this.last_op2=0,this.flags_changed=-2&flags_all&~flag_adjust&~flag_overflow},CPU.prototype.bcd_das=function(){var e=this.reg8[reg_al],t=this.getcf();this.flags&=-2,9<(15&e)||this.getaf()?(this.reg8[reg_al]-=6,this.flags|=flag_adjust,this.flags=-2&this.flags|t|6>e):this.flags&=~flag_adjust,(153<e||t)&&(this.reg8[reg_al]-=96,this.flags|=1),this.last_result=this.reg8[reg_al],this.last_op_size=OPSIZE_8,this.last_op1=this.last_op2=0,this.flags_changed=-2&flags_all&~flag_adjust&~flag_overflow},CPU.prototype.bcd_aam=function(e){if(0===e)this.trigger_de();else{var t=this.reg8[reg_al];this.reg8[reg_ah]=t/e,this.reg8[reg_al]=t%e,this.last_result=this.reg8[reg_al],this.flags_changed=-2&flags_all&~flag_adjust&~flag_overflow,this.flags=-2&this.flags&~flag_adjust&~flag_overflow}},CPU.prototype.bcd_aad=function(e){e=this.reg8[reg_al]+this.reg8[reg_ah]*e,this.last_result=255&e,this.reg16[reg_ax]=this.last_result,this.last_op_size=OPSIZE_8,this.flags_changed=-2&flags_all&~flag_adjust&~flag_overflow,this.flags=-2&this.flags&~flag_adjust&~flag_overflow,65535<e&&(this.flags|=1)},CPU.prototype.bcd_aaa=function(){9<(15&this.reg8[reg_al])||this.getaf()?(this.reg16[reg_ax]+=6,this.reg8[reg_ah]+=1,this.flags=this.flags|flag_adjust|1):this.flags=this.flags&~flag_adjust&-2,this.reg8[reg_al]&=15,this.flags_changed=this.flags_changed&~flag_adjust&-2},CPU.prototype.bcd_aas=function(){9<(15&this.reg8[reg_al])||this.getaf()?(this.reg16[reg_ax]-=6,--this.reg8[reg_ah],this.flags=this.flags|flag_adjust|1):this.flags=this.flags&~flag_adjust&-2,this.reg8[reg_al]&=15,this.flags_changed=this.flags_changed&~flag_adjust&-2},CPU.prototype.and8=function(e,t){return this.and(e,t,OPSIZE_8)},CPU.prototype.and16=function(e,t){return this.and(e,t,OPSIZE_16)},CPU.prototype.and32=function(e,t){return this.and(e,t,OPSIZE_32)},CPU.prototype.test8=function(e,t){return this.and(e,t,OPSIZE_8)},CPU.prototype.test16=function(e,t){return this.and(e,t,OPSIZE_16)},CPU.prototype.test32=function(e,t){return this.and(e,t,OPSIZE_32)},CPU.prototype.or8=function(e,t){return this.or(e,t,OPSIZE_8)},CPU.prototype.or16=function(e,t){return this.or(e,t,OPSIZE_16)},CPU.prototype.or32=function(e,t){return this.or(e,t,OPSIZE_32)},CPU.prototype.xor8=function(e,t){return this.xor(e,t,OPSIZE_8)},CPU.prototype.xor16=function(e,t){return this.xor(e,t,OPSIZE_16)},CPU.prototype.xor32=function(e,t){return this.xor(e,t,OPSIZE_32)},CPU.prototype.and=function(e,t,s){return this.last_result=e&t,this.last_op_size=s,this.flags=-2&this.flags&~flag_overflow&~flag_adjust,this.flags_changed=-2&flags_all&~flag_overflow&~flag_adjust,this.last_result},CPU.prototype.or=function(e,t,s){return this.last_result=e|t,this.last_op_size=s,this.flags=-2&this.flags&~flag_overflow&~flag_adjust,this.flags_changed=-2&flags_all&~flag_overflow&~flag_adjust,this.last_result},CPU.prototype.xor=function(e,t,s){return this.last_result=e^t,this.last_op_size=s,this.flags=-2&this.flags&~flag_overflow&~flag_adjust,this.flags_changed=-2&flags_all&~flag_overflow&~flag_adjust,this.last_result},CPU.prototype.rol8=function(e,t){return t?(t&=7,e=e<<t|e>>8-t,this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|1&e|(e<<11^e<<4)&flag_overflow,e):e},CPU.prototype.rol16=function(e,t){return t?(t&=15,e=e<<t|e>>16-t,this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|1&e|(e<<11^e>>4)&flag_overflow,e):e},CPU.prototype.rol32=function(e,t){return t?(e=e<<t|e>>>32-t,this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|1&e|(e<<11^e>>20)&flag_overflow,e):e},CPU.prototype.rcl8=function(e,t){return(t%=9)?(e=e<<t|this.getcf()<<t-1|e>>9-t,this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>8&1|(e<<3^e<<4)&flag_overflow,e):e},CPU.prototype.rcl16=function(e,t){return(t%=17)?(e=e<<t|this.getcf()<<t-1|e>>17-t,this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>16&1|(e>>5^e>>4)&flag_overflow,e):e},CPU.prototype.rcl32=function(e,t){if(!t)return e;var s=e<<t|this.getcf()<<t-1;return 1<t&&(s|=e>>>33-t),this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>>32-t&1,this.flags|=(this.flags<<11^s>>20)&flag_overflow,s},CPU.prototype.ror8=function(e,t){return t?(t&=7,e=e>>t|e<<8-t,this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>7&1|(e<<4^e<<5)&flag_overflow,e):e},CPU.prototype.ror16=function(e,t){return t?(t&=15,e=e>>t|e<<16-t,this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>15&1|(e>>4^e>>3)&flag_overflow,e):e},CPU.prototype.ror32=function(e,t){return t?(e=e>>>t|e<<32-t,this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>31&1|(e>>20^e>>19)&flag_overflow,e):e},CPU.prototype.rcr8=function(e,t){return(t%=9)?(e=e>>t|this.getcf()<<8-t|e<<9-t,this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>8&1|(e<<4^e<<5)&flag_overflow,e):e},CPU.prototype.rcr16=function(e,t){return(t%=17)?(e=e>>t|this.getcf()<<16-t|e<<17-t,this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>16&1|(e>>4^e>>3)&flag_overflow,e):e},CPU.prototype.rcr32=function(e,t){if(!t)return e;var s=e>>>t|this.getcf()<<32-t;return 1<t&&(s|=e<<33-t),this.flags_changed=-2&this.flags_changed&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>t-1&1|(s>>20^s>>19)&flag_overflow,s},CPU.prototype.shl8=function(e,t){return 0===t?e:(this.last_result=e<<t,this.last_op_size=OPSIZE_8,
this.flags_changed=-2&flags_all&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|this.last_result>>8&1|(this.last_result<<3^this.last_result<<4)&flag_overflow,this.last_result)},CPU.prototype.shl16=function(e,t){return 0===t?e:(this.last_result=e<<t,this.last_op_size=OPSIZE_16,this.flags_changed=-2&flags_all&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|this.last_result>>16&1|(this.last_result>>5^this.last_result>>4)&flag_overflow,this.last_result)},CPU.prototype.shl32=function(e,t){return 0===t?e:(this.last_result=e<<t,this.last_op_size=OPSIZE_32,this.flags_changed=-2&flags_all&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>>32-t&1,this.flags|=(1&this.flags^this.last_result>>31&1)<<11&flag_overflow,this.last_result)},CPU.prototype.shr8=function(e,t){return 0===t?e:(this.last_result=e>>t,this.last_op_size=OPSIZE_8,this.flags_changed=-2&flags_all&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>t-1&1|(e>>7&1)<<11&flag_overflow,this.last_result)},CPU.prototype.shr16=function(e,t){return 0===t?e:(this.last_result=e>>t,this.last_op_size=OPSIZE_16,this.flags_changed=-2&flags_all&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>t-1&1|e>>4&flag_overflow,this.last_result)},CPU.prototype.shr32=function(e,t){return 0===t?e:(this.last_result=e>>>t,this.last_op_size=OPSIZE_32,this.flags_changed=-2&flags_all&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>>t-1&1|e>>20&flag_overflow,this.last_result)},CPU.prototype.sar8=function(e,t){return 0===t?e:(8>t?(this.last_result=e<<24>>t+24,this.flags=-2&this.flags&~flag_overflow|e>>t-1&1):(this.last_result=e<<24>>31,this.flags=-2&this.flags&~flag_overflow|1&this.last_result),this.last_op_size=OPSIZE_8,this.flags_changed=-2&flags_all&~flag_overflow,this.last_result)},CPU.prototype.sar16=function(e,t){return 0===t?e:(16>t?(this.last_result=e<<16>>t+16,this.flags=-2&this.flags&~flag_overflow|e>>t-1&1):(this.last_result=e<<16>>31,this.flags=-2&this.flags&~flag_overflow|1&this.last_result),this.last_op_size=OPSIZE_16,this.flags_changed=-2&flags_all&~flag_overflow,this.last_result)},CPU.prototype.sar32=function(e,t){return 0===t?e:(this.last_result=e>>t,this.last_op_size=OPSIZE_32,this.flags_changed=-2&flags_all&~flag_overflow,this.flags=-2&this.flags&~flag_overflow|e>>>t-1&1,this.last_result)},CPU.prototype.shrd16=function(e,t,s){return 0===s?e:(16>=s?(this.last_result=e>>s|t<<16-s,this.flags=-2&this.flags|e>>s-1&1):(this.last_result=e<<32-s|t>>s-16,this.flags=-2&this.flags|t>>s-17&1),this.last_op_size=OPSIZE_16,this.flags_changed=-2&flags_all&~flag_overflow,this.flags=this.flags&~flag_overflow|(this.last_result^e)>>4&flag_overflow,this.last_result)},CPU.prototype.shrd32=function(e,t,s){return 0===s?e:(this.last_result=e>>>s|t<<32-s,this.last_op_size=OPSIZE_32,this.flags_changed=-2&flags_all&~flag_overflow,this.flags=-2&this.flags|e>>>s-1&1,this.flags=this.flags&~flag_overflow|(this.last_result^e)>>20&flag_overflow,this.last_result)},CPU.prototype.shld16=function(e,t,s){return 0===s?e:(16>=s?(this.last_result=e<<s|t>>>16-s,this.flags=-2&this.flags|e>>>16-s&1):(this.last_result=e>>32-s|t<<s-16,this.flags=-2&this.flags|t>>>32-s&1),this.last_op_size=OPSIZE_16,this.flags_changed=-2&flags_all&~flag_overflow,this.flags=this.flags&~flag_overflow|(1&this.flags^this.last_result>>15&1)<<11,this.last_result)},CPU.prototype.shld32=function(e,t,s){return 0===s?e:(this.last_result=e<<s|t>>>32-s,this.last_op_size=OPSIZE_32,this.flags_changed=-2&flags_all&~flag_overflow,this.flags=-2&this.flags|e>>>32-s&1,this.flags=1===s?this.flags&~flag_overflow|(1&this.flags^this.last_result>>31&1)<<11:this.flags&~flag_overflow,this.last_result)},CPU.prototype.bt_reg=function(e,t){this.flags=-2&this.flags|e>>t&1,this.flags_changed&=-2},CPU.prototype.btc_reg=function(e,t){return this.flags=-2&this.flags|e>>t&1,this.flags_changed&=-2,e^1<<t},CPU.prototype.bts_reg=function(e,t){return this.flags=-2&this.flags|e>>t&1,this.flags_changed&=-2,e|1<<t},CPU.prototype.btr_reg=function(e,t){return this.flags=-2&this.flags|e>>t&1,this.flags_changed&=-2,e&~(1<<t)},CPU.prototype.bt_mem=function(e,t){e=this.safe_read8(e+(t>>3)|0),this.flags=-2&this.flags|e>>(7&t)&1,this.flags_changed&=-2},CPU.prototype.btc_mem=function(e,t){e=this.translate_address_write(e+(t>>3)|0);var s=this.read8(e);t&=7,this.flags=-2&this.flags|s>>t&1,this.flags_changed&=-2,this.write8(e,s^1<<t)},CPU.prototype.btr_mem=function(e,t){e=this.translate_address_write(e+(t>>3)|0);var s=this.read8(e);t&=7,this.flags=-2&this.flags|s>>t&1,this.flags_changed&=-2,this.write8(e,s&~(1<<t))},CPU.prototype.bts_mem=function(e,t){e=this.translate_address_write(e+(t>>3)|0);var s=this.read8(e);t&=7,this.flags=-2&this.flags|s>>t&1,this.flags_changed&=-2,this.write8(e,s|1<<t)},CPU.prototype.bsf16=function(e,t){return this.flags_changed=flags_all&~flag_zero,this.last_op_size=OPSIZE_16,0===t?(this.flags|=flag_zero,this.last_result=t,e):(this.flags&=~flag_zero,this.last_result=v86util.int_log2(-t&t))},CPU.prototype.bsf32=function(e,t){return this.flags_changed=flags_all&~flag_zero,this.last_op_size=OPSIZE_32,0===t?(this.flags|=flag_zero,this.last_result=t,e):(this.flags&=~flag_zero,this.last_result=v86util.int_log2((-t&t)>>>0))},CPU.prototype.bsr16=function(e,t){return this.flags_changed=flags_all&~flag_zero,this.last_op_size=OPSIZE_16,0===t?(this.flags|=flag_zero,this.last_result=t,e):(this.flags&=~flag_zero,this.last_result=v86util.int_log2(t))},CPU.prototype.bsr32=function(e,t){return this.flags_changed=flags_all&~flag_zero,this.last_op_size=OPSIZE_32,0===t?(this.flags|=flag_zero,this.last_result=t,e):(this.flags&=~flag_zero,this.last_result=v86util.int_log2(t>>>0))},CPU.prototype.popcnt=function(e){return this.flags_changed=0,this.flags&=~flags_all,e?(e-=e>>1&1431655765,16843009*((e=(858993459&e)+(e>>2&858993459))+(e>>4)&252645135)>>24):(this.flags|=flag_zero,0)},CPU.prototype.saturate_sw_to_ub=function(e){return dbg_assert(0==(4294901760&e)),e>>>=0,32768<=e?e=0:255<e&&(e=255),dbg_assert(0==(4294967040&e)),e},CPU.prototype.saturate_sw_to_sb=function(e){return dbg_assert(0==(4294901760&e)),65408<e?e&=255:32767<e?e=128:127<e&&(e=127),dbg_assert(0==(4294967040&e)),e},CPU.prototype.saturate_sd_to_sw=function(e){return e>>>=0,4294934528<e?e&=65535:2147483647<e?e=32768:32767<e&&(e=32767),dbg_assert(0==(4294901760&e)),e},CPU.prototype.saturate_sd_to_sb=function(e){return e>>>=0,4294967168<e?e&=255:2147483647<e?e=128:127<e&&(e=127),dbg_assert(0==(4294967040&e)),e},CPU.prototype.saturate_sd_to_ub=function(e){return e|=0,0>e&&(e=0),dbg_assert(0==(4294967040&e)),e},CPU.prototype.saturate_ud_to_ub=function(e){return e>>>=0,255<e&&(e=255),dbg_assert(0==(4294967040&e)),e},CPU.prototype.saturate_uw=function(e){return dbg_assert(0<=e),65535<e?65535:e},CPU.prototype.jmpcc8=function(e){var t=this.read_op8s();e?(this.instruction_pointer=this.instruction_pointer+t|0,this.branch_taken()):this.branch_not_taken()},CPU.prototype.jmp_rel16=function(e){var t=this.get_seg(reg_cs);this.instruction_pointer-=t,this.instruction_pointer=this.instruction_pointer+e&65535,this.instruction_pointer=this.instruction_pointer+t|0},CPU.prototype.jmpcc16=function(e){var t=this.read_op16();e?(this.jmp_rel16(t),this.branch_taken()):this.branch_not_taken()},CPU.prototype.jmpcc32=function(e){var t=this.read_op32s();e?(this.instruction_pointer=this.instruction_pointer+t|0,this.branch_taken()):this.branch_not_taken()},CPU.prototype.cmovcc16=function(e){var t=this.read_e16();e&&this.write_g16(t)},CPU.prototype.cmovcc32=function(e){var t=this.read_e32s();e&&this.write_g32(t)},CPU.prototype.setcc=function(e){this.set_e8(e?1:0)},CPU.prototype.loopne=function(e){this.decr_ecx_asize()&&!this.getzf()?(this.instruction_pointer=this.instruction_pointer+e|0,this.branch_taken()):this.branch_not_taken()},CPU.prototype.loope=function(e){this.decr_ecx_asize()&&this.getzf()?(this.instruction_pointer=this.instruction_pointer+e|0,this.branch_taken()):this.branch_not_taken()},CPU.prototype.loop=function(e){this.decr_ecx_asize()?(this.instruction_pointer=this.instruction_pointer+e|0,this.branch_taken()):this.branch_not_taken()},CPU.prototype.jcxz=function(e){0===this.get_reg_asize(reg_ecx)?(this.instruction_pointer=this.instruction_pointer+e|0,this.branch_taken()):this.branch_not_taken()},CPU.prototype.getcf=function(){return 1&this.flags_changed?(this.last_op1^(this.last_op1^this.last_op2)&(this.last_op2^this.last_add_result))>>>this.last_op_size&1:1&this.flags},CPU.prototype.getpf=function(){return this.flags_changed&flag_parity?154020>>(15&(this.last_result^this.last_result>>4))&flag_parity:this.flags&flag_parity},CPU.prototype.getaf=function(){return this.flags_changed&flag_adjust?(this.last_op1^this.last_op2^this.last_add_result)&flag_adjust:this.flags&flag_adjust},CPU.prototype.getzf=function(){return this.flags_changed&flag_zero?(~this.last_result&this.last_result-1)>>>this.last_op_size&1:this.flags&flag_zero},CPU.prototype.getsf=function(){return this.flags_changed&flag_sign?this.last_result>>>this.last_op_size&1:this.flags&flag_sign},CPU.prototype.getof=function(){return this.flags_changed&flag_overflow?((this.last_op1^this.last_add_result)&(this.last_op2^this.last_add_result))>>>this.last_op_size&1:this.flags&flag_overflow},CPU.prototype.test_o=CPU.prototype.getof,CPU.prototype.test_b=CPU.prototype.getcf,CPU.prototype.test_z=CPU.prototype.getzf,CPU.prototype.test_s=CPU.prototype.getsf,CPU.prototype.test_p=CPU.prototype.getpf,CPU.prototype.test_be=function(){return this.getcf()||this.getzf()},CPU.prototype.test_l=function(){return!this.getsf()!=!this.getof()},CPU.prototype.test_le=function(){return this.getzf()||!this.getsf()!=!this.getof()},CPU.prototype.push16=function(e){var t=this.get_stack_pointer(-2);this.safe_write16(t,e),this.adjust_stack_reg(-2)},CPU.prototype.push32=function(e){var t=this.get_stack_pointer(-4);this.safe_write32(t,e),this.adjust_stack_reg(-4)},CPU.prototype.pop16=function(){var e=this.get_seg(reg_ss)+this.get_stack_reg()|0;return e=this.safe_read16(e),this.adjust_stack_reg(2),e},CPU.prototype.pop32s=function(){var e=this.get_seg(reg_ss)+this.get_stack_reg()|0;return e=this.safe_read32s(e),this.adjust_stack_reg(4),e},CPU.prototype.pusha16=function(){var e=this.reg16[reg_sp];this.writable_or_pagefault(this.get_stack_pointer(-16),16),this.push16(this.reg16[reg_ax]),this.push16(this.reg16[reg_cx]),this.push16(this.reg16[reg_dx]),this.push16(this.reg16[reg_bx]),this.push16(e),this.push16(this.reg16[reg_bp]),this.push16(this.reg16[reg_si]),this.push16(this.reg16[reg_di])},CPU.prototype.pusha32=function(){var e=this.reg32s[reg_esp];this.writable_or_pagefault(this.get_stack_pointer(-32),32),this.push32(this.reg32s[reg_eax]),this.push32(this.reg32s[reg_ecx]),this.push32(this.reg32s[reg_edx]),this.push32(this.reg32s[reg_ebx]),this.push32(e),this.push32(this.reg32s[reg_ebp]),this.push32(this.reg32s[reg_esi]),this.push32(this.reg32s[reg_edi])},CPU.prototype.popa16=function(){this.translate_address_read(this.get_stack_pointer(0)),this.translate_address_read(this.get_stack_pointer(15)),this.reg16[reg_di]=this.pop16(),this.reg16[reg_si]=this.pop16(),this.reg16[reg_bp]=this.pop16(),this.adjust_stack_reg(2),this.reg16[reg_bx]=this.pop16(),this.reg16[reg_dx]=this.pop16(),this.reg16[reg_cx]=this.pop16(),this.reg16[reg_ax]=this.pop16()},CPU.prototype.popa32=function(){this.translate_address_read(this.get_stack_pointer(0)),this.translate_address_read(this.get_stack_pointer(31)),this.reg32s[reg_edi]=this.pop32s(),this.reg32s[reg_esi]=this.pop32s(),this.reg32s[reg_ebp]=this.pop32s(),this.adjust_stack_reg(4),this.reg32s[reg_ebx]=this.pop32s(),this.reg32s[reg_edx]=this.pop32s(),this.reg32s[reg_ecx]=this.pop32s(),this.reg32s[reg_eax]=this.pop32s()},CPU.prototype.xchg8=function(e,t){t=t>>1&12|t>>5&1;var s=this.reg8[t];return this.reg8[t]=e,s},CPU.prototype.xchg16=function(e,t){t=t>>2&14;var s=this.reg16[t];return this.reg16[t]=e,s},CPU.prototype.xchg16r=function(e){var t=this.reg16[reg_ax];this.reg16[reg_ax]=this.reg16[e],this.reg16[e]=t},CPU.prototype.xchg32=function(e,t){t=t>>3&7;var s=this.reg32s[t];return this.reg32s[t]=e,s},CPU.prototype.xchg32r=function(e){var t=this.reg32s[reg_eax];this.reg32s[reg_eax]=this.reg32s[e],this.reg32s[e]=t},CPU.prototype.lss16=function(e){192<=this.modrm_byte&&this.trigger_ud();var t=this.modrm_resolve(this.modrm_byte),s=this.safe_read16(t);t=this.safe_read16(t+2|0),this.switch_seg(e,t),this.reg16[this.modrm_byte>>2&14]=s},CPU.prototype.lss32=function(e){192<=this.modrm_byte&&this.trigger_ud();var t=this.modrm_resolve(this.modrm_byte),s=this.safe_read32s(t);t=this.safe_read16(t+4|0),this.switch_seg(e,t),this.reg32s[this.modrm_byte>>3&7]=s},CPU.prototype.enter16=function(e,t){(t&=31)&&dbg_log("enter16 stack="+(this.stack_size_32?32:16)+" size="+e+" nest="+t,LOG_CPU),this.push16(this.reg16[reg_bp]);var s=this.reg16[reg_sp];if(0<t){for(var r=this.reg16[reg_ebp],i=1;i<t;i++)r-=2,this.push16(this.safe_read16(this.get_seg(reg_ss)+r|0));this.push16(s)}this.reg16[reg_bp]=s,this.adjust_stack_reg(-e)},CPU.prototype.enter32=function(e,t){(t&=31)&&dbg_log("enter32 stack="+(this.stack_size_32?32:16)+" size="+e+" nest="+t,LOG_CPU),this.push32(this.reg32s[reg_ebp]);var s=this.reg32s[reg_esp];if(0<t){for(var r=this.reg32s[reg_ebp],i=1;i<t;i++)r-=4,this.push32(this.safe_read32s(this.get_seg(reg_ss)+r|0));this.push32(s)}this.reg32s[reg_ebp]=s,this.adjust_stack_reg(-e)},CPU.prototype.bswap=function(e){var t=this.reg32s[e];this.reg32s[e]=t>>>24|t<<24|t>>8&65280|t<<8&16711680},CPU.prototype.fxsave=function(e){this.writable_or_pagefault(e,512),this.safe_write16(e+0|0,this.fpu.control_word),this.safe_write16(e+2|0,this.fpu.load_status_word()),this.safe_write8(e+4|0,255&~this.fpu.stack_empty),this.safe_write16(e+6|0,this.fpu.fpu_opcode),this.safe_write32(e+8|0,this.fpu.fpu_ip),this.safe_write16(e+12|0,this.fpu.fpu_ip_selector),this.safe_write32(e+16|0,this.fpu.fpu_dp),this.safe_write16(e+20|0,this.fpu.fpu_dp_selector),this.safe_write32(e+24|0,this.mxcsr),this.safe_write32(e+28|0,MXCSR_MASK);for(var t=0;8>t;t++)this.fpu.store_m80(e+32+(t<<4)|0,this.fpu.st[this.fpu.stack_ptr+t&7]);for(t=0;8>t;t++)this.safe_write32(e+160+(t<<4)+0|0,this.reg_xmm32s[t<<2|0]),this.safe_write32(e+160+(t<<4)+4|0,this.reg_xmm32s[t<<2|1]),this.safe_write32(e+160+(t<<4)+8|0,this.reg_xmm32s[t<<2|2]),this.safe_write32(e+160+(t<<4)+12|0,this.reg_xmm32s[t<<2|3])},CPU.prototype.fxrstor=function(e){this.translate_address_read(0|e),this.translate_address_read(e+511|0);var t=this.safe_read32s(e+24|0);for(t&~MXCSR_MASK&&(dbg_log("Invalid mxcsr bits: "+h((t&~MXCSR_MASK)>>>0,8)),this.trigger_gp(0)),this.fpu.control_word=this.safe_read16(e+0|0),this.fpu.set_status_word(this.safe_read16(e+2|0)),this.fpu.stack_empty=255&~this.safe_read8(e+4|0),this.fpu.fpu_opcode=this.safe_read16(e+6|0),this.fpu.fpu_ip=this.safe_read32s(e+8|0),this.fpu.fpu_ip=this.safe_read16(e+12|0),this.fpu.fpu_dp=this.safe_read32s(e+16|0),this.fpu.fpu_dp_selector=this.safe_read16(e+20|0),this.mxcsr=t,t=0;8>t;t++)this.fpu.st[this.fpu.stack_ptr+t&7]=this.fpu.load_m80(e+32+(t<<4)|0);for(t=0;8>t;t++)this.reg_xmm32s[t<<2|0]=this.safe_read32s(e+160+(t<<4)+0|0),this.reg_xmm32s[t<<2|1]=this.safe_read32s(e+160+(t<<4)+4|0),this.reg_xmm32s[t<<2|2]=this.safe_read32s(e+160+(t<<4)+8|0),this.reg_xmm32s[t<<2|3]=this.safe_read32s(e+160+(t<<4)+12|0)};var t=[],t16=[],t32=[];t[0]=function(e){e.read_modrm_byte(),e.write_e8(e.add8(e.read_write_e8(),e.read_g8()))},t16[1]=function(e){e.read_modrm_byte(),e.write_e16(e.add16(e.read_write_e16(),e.read_g16()))},t32[1]=function(e){e.read_modrm_byte(),e.write_e32(e.add32(e.read_write_e32(),e.read_g32s()))},t[2]=function(e){e.read_modrm_byte(),e.write_g8(e.add8(e.read_g8(),e.read_e8()))},t16[3]=function(e){e.read_modrm_byte(),e.write_g16(e.add16(e.read_g16(),e.read_e16()))},t32[3]=function(e){e.read_modrm_byte(),e.write_g32(e.add32(e.read_g32s(),e.read_e32s()))},t[4]=function(e){e.reg8[reg_al]=e.add8(e.reg8[reg_al],e.read_op8())},t16[5]=function(e){e.reg16[reg_ax]=e.add16(e.reg16[reg_ax],e.read_op16())},t32[5]=function(e){e.reg32s[reg_eax]=e.add32(e.reg32s[reg_eax],e.read_op32s())},t16[6]=function(e){e.push16(e.sreg[reg_es])},t32[6]=function(e){e.push32(e.sreg[reg_es])},t16[7]=function(e){e.switch_seg(reg_es,e.safe_read16(e.get_stack_pointer(0))),e.adjust_stack_reg(2)},t32[7]=function(e){e.switch_seg(reg_es,65535&e.safe_read32s(e.get_stack_pointer(0))),e.adjust_stack_reg(4)},t[8]=function(e){e.read_modrm_byte(),e.write_e8(e.or8(e.read_write_e8(),e.read_g8()))},t16[9]=function(e){e.read_modrm_byte(),e.write_e16(e.or16(e.read_write_e16(),e.read_g16()))},t32[9]=function(e){e.read_modrm_byte(),e.write_e32(e.or32(e.read_write_e32(),e.read_g32s()))},t[10]=function(e){e.read_modrm_byte(),e.write_g8(e.or8(e.read_g8(),e.read_e8()))},t16[11]=function(e){e.read_modrm_byte(),e.write_g16(e.or16(e.read_g16(),e.read_e16()))},t32[11]=function(e){e.read_modrm_byte(),e.write_g32(e.or32(e.read_g32s(),e.read_e32s()))},t[12]=function(e){e.reg8[reg_al]=e.or8(e.reg8[reg_al],e.read_op8())},t16[13]=function(e){e.reg16[reg_ax]=e.or16(e.reg16[reg_ax],e.read_op16())},t32[13]=function(e){e.reg32s[reg_eax]=e.or32(e.reg32s[reg_eax],e.read_op32s())},t16[14]=function(e){e.push16(e.sreg[reg_cs])},t32[14]=function(e){e.push32(e.sreg[reg_cs])},t16[15]=function(e){e.table0F_16[e.read_op0F()](e)},t32[15]=function(e){e.table0F_32[e.read_op0F()](e)},t[16]=function(e){e.read_modrm_byte(),e.write_e8(e.adc8(e.read_write_e8(),e.read_g8()))},t16[17]=function(e){e.read_modrm_byte(),e.write_e16(e.adc16(e.read_write_e16(),e.read_g16()))},t32[17]=function(e){e.read_modrm_byte(),e.write_e32(e.adc32(e.read_write_e32(),e.read_g32s()))},t[18]=function(e){e.read_modrm_byte(),e.write_g8(e.adc8(e.read_g8(),e.read_e8()))},t16[19]=function(e){e.read_modrm_byte(),e.write_g16(e.adc16(e.read_g16(),e.read_e16()))},t32[19]=function(e){e.read_modrm_byte(),e.write_g32(e.adc32(e.read_g32s(),e.read_e32s()))},t[20]=function(e){e.reg8[reg_al]=e.adc8(e.reg8[reg_al],e.read_op8())},t16[21]=function(e){e.reg16[reg_ax]=e.adc16(e.reg16[reg_ax],e.read_op16())},t32[21]=function(e){e.reg32s[reg_eax]=e.adc32(e.reg32s[reg_eax],e.read_op32s())},t16[22]=function(e){e.push16(e.sreg[reg_ss])},t32[22]=function(e){e.push32(e.sreg[reg_ss])},t16[23]=function(e){e.switch_seg(reg_ss,e.safe_read16(e.get_stack_pointer(0))),e.adjust_stack_reg(2),e.clear_prefixes(),e.cycle_internal()},t32[23]=function(e){e.switch_seg(reg_ss,65535&e.safe_read32s(e.get_stack_pointer(0))),e.adjust_stack_reg(4),e.clear_prefixes(),e.cycle_internal()},t[24]=function(e){e.read_modrm_byte(),e.write_e8(e.sbb8(e.read_write_e8(),e.read_g8()))},t16[25]=function(e){e.read_modrm_byte(),e.write_e16(e.sbb16(e.read_write_e16(),e.read_g16()))},t32[25]=function(e){e.read_modrm_byte(),e.write_e32(e.sbb32(e.read_write_e32(),e.read_g32s()))},t[26]=function(e){e.read_modrm_byte(),e.write_g8(e.sbb8(e.read_g8(),e.read_e8()))},t16[27]=function(e){e.read_modrm_byte(),e.write_g16(e.sbb16(e.read_g16(),e.read_e16()))},t32[27]=function(e){e.read_modrm_byte(),e.write_g32(e.sbb32(e.read_g32s(),e.read_e32s()))},t[28]=function(e){e.reg8[reg_al]=e.sbb8(e.reg8[reg_al],e.read_op8())},t16[29]=function(e){e.reg16[reg_ax]=e.sbb16(e.reg16[reg_ax],e.read_op16())},t32[29]=function(e){e.reg32s[reg_eax]=e.sbb32(e.reg32s[reg_eax],e.read_op32s())},t16[30]=function(e){e.push16(e.sreg[reg_ds])},t32[30]=function(e){e.push32(e.sreg[reg_ds])},t16[31]=function(e){e.switch_seg(reg_ds,e.safe_read16(e.get_stack_pointer(0))),e.adjust_stack_reg(2)},t32[31]=function(e){e.switch_seg(reg_ds,65535&e.safe_read32s(e.get_stack_pointer(0))),e.adjust_stack_reg(4)},t[32]=function(e){e.read_modrm_byte(),e.write_e8(e.and8(e.read_write_e8(),e.read_g8()))},t16[33]=function(e){e.read_modrm_byte(),e.write_e16(e.and16(e.read_write_e16(),e.read_g16()))},t32[33]=function(e){e.read_modrm_byte(),e.write_e32(e.and32(e.read_write_e32(),e.read_g32s()))},t[34]=function(e){e.read_modrm_byte(),e.write_g8(e.and8(e.read_g8(),e.read_e8()))},t16[35]=function(e){e.read_modrm_byte(),e.write_g16(e.and16(e.read_g16(),e.read_e16()))},t32[35]=function(e){e.read_modrm_byte(),e.write_g32(e.and32(e.read_g32s(),e.read_e32s()))},t[36]=function(e){e.reg8[reg_al]=e.and8(e.reg8[reg_al],e.read_op8())},t16[37]=function(e){e.reg16[reg_ax]=e.and16(e.reg16[reg_ax],e.read_op16())},t32[37]=function(e){e.reg32s[reg_eax]=e.and32(e.reg32s[reg_eax],e.read_op32s())},t[38]=function(e){e.segment_prefix_op(reg_es)},t[39]=function(e){e.bcd_daa()},t[40]=function(e){e.read_modrm_byte(),e.write_e8(e.sub8(e.read_write_e8(),e.read_g8()))},t16[41]=function(e){e.read_modrm_byte(),e.write_e16(e.sub16(e.read_write_e16(),e.read_g16()))},t32[41]=function(e){e.read_modrm_byte(),e.write_e32(e.sub32(e.read_write_e32(),e.read_g32s()))},t[42]=function(e){e.read_modrm_byte(),e.write_g8(e.sub8(e.read_g8(),e.read_e8()))},t16[43]=function(e){e.read_modrm_byte(),e.write_g16(e.sub16(e.read_g16(),e.read_e16()))},t32[43]=function(e){e.read_modrm_byte(),e.write_g32(e.sub32(e.read_g32s(),e.read_e32s()))},t[44]=function(e){e.reg8[reg_al]=e.sub8(e.reg8[reg_al],e.read_op8())},t16[45]=function(e){e.reg16[reg_ax]=e.sub16(e.reg16[reg_ax],e.read_op16())},t32[45]=function(e){e.reg32s[reg_eax]=e.sub32(e.reg32s[reg_eax],e.read_op32s())},t[46]=function(e){e.segment_prefix_op(reg_cs)},t[47]=function(e){e.bcd_das()},t[48]=function(e){e.read_modrm_byte(),e.write_e8(e.xor8(e.read_write_e8(),e.read_g8()))},t16[49]=function(e){e.read_modrm_byte(),e.write_e16(e.xor16(e.read_write_e16(),e.read_g16()))},t32[49]=function(e){e.read_modrm_byte(),e.write_e32(e.xor32(e.read_write_e32(),e.read_g32s()))},t[50]=function(e){e.read_modrm_byte(),e.write_g8(e.xor8(e.read_g8(),e.read_e8()))},t16[51]=function(e){e.read_modrm_byte(),e.write_g16(e.xor16(e.read_g16(),e.read_e16()))},t32[51]=function(e){e.read_modrm_byte(),e.write_g32(e.xor32(e.read_g32s(),e.read_e32s()))},t[52]=function(e){e.reg8[reg_al]=e.xor8(e.reg8[reg_al],e.read_op8())},t16[53]=function(e){e.reg16[reg_ax]=e.xor16(e.reg16[reg_ax],e.read_op16())},t32[53]=function(e){e.reg32s[reg_eax]=e.xor32(e.reg32s[reg_eax],e.read_op32s())},t[54]=function(e){e.segment_prefix_op(reg_ss)},t[55]=function(e){e.bcd_aaa()},t[56]=function(e){e.read_modrm_byte(),e.cmp8(e.read_e8(),e.read_g8())},t16[57]=function(e){e.read_modrm_byte(),e.cmp16(e.read_e16(),e.read_g16())},t32[57]=function(e){e.read_modrm_byte(),e.cmp32(e.read_e32s(),e.read_g32s())},t[58]=function(e){e.read_modrm_byte(),e.cmp8(e.read_g8(),e.read_e8())},t16[59]=function(e){e.read_modrm_byte(),e.cmp16(e.read_g16(),e.read_e16())},t32[59]=function(e){e.read_modrm_byte(),e.cmp32(e.read_g32s(),e.read_e32s())},t[60]=function(e){e.cmp8(e.reg8[reg_al],e.read_op8())},t16[61]=function(e){e.cmp16(e.reg16[reg_ax],e.read_op16())},t32[61]=function(e){e.cmp32(e.reg32s[reg_eax],e.read_op32s())},t[62]=function(e){e.segment_prefix_op(reg_ds)},t[63]=function(e){e.bcd_aas()},t16[64]=function(e){e.reg16[reg_ax]=e.inc16(e.reg16[reg_ax])},t32[64]=function(e){e.reg32s[reg_eax]=e.inc32(e.reg32s[reg_eax])},t16[65]=function(e){e.reg16[reg_cx]=e.inc16(e.reg16[reg_cx])},t32[65]=function(e){e.reg32s[reg_ecx]=e.inc32(e.reg32s[reg_ecx])},t16[66]=function(e){e.reg16[reg_dx]=e.inc16(e.reg16[reg_dx])},t32[66]=function(e){e.reg32s[reg_edx]=e.inc32(e.reg32s[reg_edx])},t16[67]=function(e){e.reg16[reg_bx]=e.inc16(e.reg16[reg_bx])},t32[67]=function(e){e.reg32s[reg_ebx]=e.inc32(e.reg32s[reg_ebx])},t16[68]=function(e){e.reg16[reg_sp]=e.inc16(e.reg16[reg_sp])},t32[68]=function(e){e.reg32s[reg_esp]=e.inc32(e.reg32s[reg_esp])},t16[69]=function(e){e.reg16[reg_bp]=e.inc16(e.reg16[reg_bp])},t32[69]=function(e){e.reg32s[reg_ebp]=e.inc32(e.reg32s[reg_ebp])},t16[70]=function(e){e.reg16[reg_si]=e.inc16(e.reg16[reg_si])},t32[70]=function(e){e.reg32s[reg_esi]=e.inc32(e.reg32s[reg_esi])},t16[71]=function(e){e.reg16[reg_di]=e.inc16(e.reg16[reg_di])},t32[71]=function(e){e.reg32s[reg_edi]=e.inc32(e.reg32s[reg_edi])},t16[72]=function(e){e.reg16[reg_ax]=e.dec16(e.reg16[reg_ax])},t32[72]=function(e){e.reg32s[reg_eax]=e.dec32(e.reg32s[reg_eax])},t16[73]=function(e){e.reg16[reg_cx]=e.dec16(e.reg16[reg_cx])},t32[73]=function(e){e.reg32s[reg_ecx]=e.dec32(e.reg32s[reg_ecx])},t16[74]=function(e){e.reg16[reg_dx]=e.dec16(e.reg16[reg_dx])},t32[74]=function(e){e.reg32s[reg_edx]=e.dec32(e.reg32s[reg_edx])},t16[75]=function(e){e.reg16[reg_bx]=e.dec16(e.reg16[reg_bx])},t32[75]=function(e){e.reg32s[reg_ebx]=e.dec32(e.reg32s[reg_ebx])},t16[76]=function(e){e.reg16[reg_sp]=e.dec16(e.reg16[reg_sp])},t32[76]=function(e){e.reg32s[reg_esp]=e.dec32(e.reg32s[reg_esp])},t16[77]=function(e){e.reg16[reg_bp]=e.dec16(e.reg16[reg_bp])},t32[77]=function(e){e.reg32s[reg_ebp]=e.dec32(e.reg32s[reg_ebp])},t16[78]=function(e){e.reg16[reg_si]=e.dec16(e.reg16[reg_si])},t32[78]=function(e){e.reg32s[reg_esi]=e.dec32(e.reg32s[reg_esi])},t16[79]=function(e){e.reg16[reg_di]=e.dec16(e.reg16[reg_di])},t32[79]=function(e){e.reg32s[reg_edi]=e.dec32(e.reg32s[reg_edi])},t16[80]=function(e){e.push16(e.reg16[reg_ax])},t32[80]=function(e){e.push32(e.reg32s[reg_eax])},t16[81]=function(e){e.push16(e.reg16[reg_cx])},t32[81]=function(e){e.push32(e.reg32s[reg_ecx])},t16[82]=function(e){e.push16(e.reg16[reg_dx])},t32[82]=function(e){e.push32(e.reg32s[reg_edx])},t16[83]=function(e){e.push16(e.reg16[reg_bx])},t32[83]=function(e){e.push32(e.reg32s[reg_ebx])},t16[84]=function(e){e.push16(e.reg16[reg_sp])},t32[84]=function(e){e.push32(e.reg32s[reg_esp])},t16[85]=function(e){e.push16(e.reg16[reg_bp])},t32[85]=function(e){e.push32(e.reg32s[reg_ebp])},t16[86]=function(e){e.push16(e.reg16[reg_si])},t32[86]=function(e){e.push32(e.reg32s[reg_esi])},t16[87]=function(e){e.push16(e.reg16[reg_di])},t32[87]=function(e){e.push32(e.reg32s[reg_edi])},t16[88]=function(e){e.reg16[reg_ax]=e.pop16()},t32[88]=function(e){e.reg32s[reg_eax]=e.pop32s()},t16[89]=function(e){e.reg16[reg_cx]=e.pop16()},t32[89]=function(e){e.reg32s[reg_ecx]=e.pop32s()},t16[90]=function(e){e.reg16[reg_dx]=e.pop16()},t32[90]=function(e){e.reg32s[reg_edx]=e.pop32s()},t16[91]=function(e){e.reg16[reg_bx]=e.pop16()},t32[91]=function(e){e.reg32s[reg_ebx]=e.pop32s()},t16[92]=function(e){e.reg16[reg_sp]=e.pop16()},t32[92]=function(e){e.reg32s[reg_esp]=e.pop32s()},t16[93]=function(e){e.reg16[reg_bp]=e.pop16()},t32[93]=function(e){e.reg32s[reg_ebp]=e.pop32s()},t16[94]=function(e){e.reg16[reg_si]=e.pop16()},t32[94]=function(e){e.reg32s[reg_esi]=e.pop32s()},t16[95]=function(e){e.reg16[reg_di]=e.pop16()},t32[95]=function(e){e.reg32s[reg_edi]=e.pop32s()},t16[96]=function(e){e.pusha16()},t32[96]=function(e){e.pusha32()},t16[97]=function(e){e.popa16()},t32[97]=function(e){e.popa32()},t[98]=function(e){dbg_log("Unimplemented BOUND instruction",LOG_CPU),dbg_assert(!1)},t[99]=function(e){e.read_modrm_byte(),e.protected_mode&&!e.vm86_mode()?e.write_e16(e.arpl(e.read_write_e16(),e.modrm_byte>>2&14)):(dbg_log("arpl #ud",LOG_CPU),e.trigger_ud())},t[100]=function(e){e.segment_prefix_op(reg_fs)},t[101]=function(e){e.segment_prefix_op(reg_gs)},t[102]=function(e){e.prefixes|=PREFIX_MASK_OPSIZE,e.run_prefix_instruction(),e.prefixes=0},t[103]=function(e){dbg_assert(e.is_asize_32()===e.is_32),e.prefixes|=PREFIX_MASK_ADDRSIZE,e.run_prefix_instruction(),e.prefixes=0},t16[104]=function(e){e.push16(e.read_op16())},t32[104]=function(e){e.push32(e.read_op32s())},t16[105]=function(e){e.read_modrm_byte(),e.write_g16(e.imul_reg16(e.read_e16s(),e.read_op16()<<16>>16))},t32[105]=function(e){e.read_modrm_byte(),e.write_g32(e.imul_reg32(e.read_e32s(),e.read_op32s()))},t16[106]=function(e){e.push16(e.read_op8s())},t32[106]=function(e){e.push32(e.read_op8s())},t16[107]=function(e){e.read_modrm_byte(),e.write_g16(e.imul_reg16(e.read_e16s(),e.read_op8s()))},t32[107]=function(e){e.read_modrm_byte(),e.write_g32(e.imul_reg32(e.read_e32s(),e.read_op8s()))},t[108]=function(e){insb(e)},t16[109]=function(e){insw(e)},t32[109]=function(e){insd(e)},t[110]=function(e){outsb(e)},t16[111]=function(e){outsw(e)},t32[111]=function(e){outsd(e)},t[112]=function(e){e.jmpcc8(e.test_o())},t[113]=function(e){e.jmpcc8(!e.test_o())},t[114]=function(e){e.jmpcc8(e.test_b())},t[115]=function(e){e.jmpcc8(!e.test_b())},t[116]=function(e){e.jmpcc8(e.test_z())},t[117]=function(e){e.jmpcc8(!e.test_z())},t[118]=function(e){e.jmpcc8(e.test_be())},t[119]=function(e){e.jmpcc8(!e.test_be())},t[120]=function(e){e.jmpcc8(e.test_s())},t[121]=function(e){e.jmpcc8(!e.test_s())},t[122]=function(e){e.jmpcc8(e.test_p())},t[123]=function(e){e.jmpcc8(!e.test_p())},t[124]=function(e){e.jmpcc8(e.test_l())},t[125]=function(e){e.jmpcc8(!e.test_l())},t[126]=function(e){e.jmpcc8(e.test_le())},t[127]=function(e){e.jmpcc8(!e.test_le())};t[128]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 0:e.write_e8(e.add8(e.read_write_e8(),e.read_op8()));break;case 1:e.write_e8(e.or8(e.read_write_e8(),e.read_op8()));break;case 2:e.write_e8(e.adc8(e.read_write_e8(),e.read_op8()));break;case 3:e.write_e8(e.sbb8(e.read_write_e8(),e.read_op8()));break;case 4:e.write_e8(e.and8(e.read_write_e8(),e.read_op8()));break;case 5:e.write_e8(e.sub8(e.read_write_e8(),e.read_op8()));break;case 6:e.write_e8(e.xor8(e.read_write_e8(),e.read_op8()));break;case 7:e.cmp8(e.read_e8(),e.read_op8())}},t16[129]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 0:e.write_e16(e.add16(e.read_write_e16(),e.read_op16()));break;case 1:e.write_e16(e.or16(e.read_write_e16(),e.read_op16()));break;case 2:e.write_e16(e.adc16(e.read_write_e16(),e.read_op16()));break;case 3:e.write_e16(e.sbb16(e.read_write_e16(),e.read_op16()));break;case 4:e.write_e16(e.and16(e.read_write_e16(),e.read_op16()));break;case 5:e.write_e16(e.sub16(e.read_write_e16(),e.read_op16()));break;case 6:e.write_e16(e.xor16(e.read_write_e16(),e.read_op16()));break;case 7:e.cmp16(e.read_e16(),e.read_op16())}},t32[129]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 0:e.write_e32(e.add32(e.read_write_e32(),e.read_op32s()));break;case 1:e.write_e32(e.or32(e.read_write_e32(),e.read_op32s()));break;case 2:e.write_e32(e.adc32(e.read_write_e32(),e.read_op32s()));break;case 3:e.write_e32(e.sbb32(e.read_write_e32(),e.read_op32s()));break;case 4:e.write_e32(e.and32(e.read_write_e32(),e.read_op32s()));break;case 5:e.write_e32(e.sub32(e.read_write_e32(),e.read_op32s()));break;case 6:e.write_e32(e.xor32(e.read_write_e32(),e.read_op32s()));break;case 7:e.cmp32(e.read_e32s(),e.read_op32s())}},t[130]=t[128],t16[131]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 0:e.write_e16(e.add16(e.read_write_e16(),e.read_op8s()));break;case 1:e.write_e16(e.or16(e.read_write_e16(),e.read_op8s()));break;case 2:e.write_e16(e.adc16(e.read_write_e16(),e.read_op8s()));break;case 3:e.write_e16(e.sbb16(e.read_write_e16(),e.read_op8s()));break;case 4:e.write_e16(e.and16(e.read_write_e16(),e.read_op8s()));break;case 5:e.write_e16(e.sub16(e.read_write_e16(),e.read_op8s()));break;case 6:e.write_e16(e.xor16(e.read_write_e16(),e.read_op8s()));break;case 7:e.cmp16(e.read_e16(),e.read_op8s())}},t32[131]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 0:e.write_e32(e.add32(e.read_write_e32(),e.read_op8s()));break;case 1:e.write_e32(e.or32(e.read_write_e32(),e.read_op8s()));break;case 2:e.write_e32(e.adc32(e.read_write_e32(),e.read_op8s()));break;case 3:e.write_e32(e.sbb32(e.read_write_e32(),e.read_op8s()));break;case 4:e.write_e32(e.and32(e.read_write_e32(),e.read_op8s()));break;case 5:e.write_e32(e.sub32(e.read_write_e32(),e.read_op8s()));break;case 6:e.write_e32(e.xor32(e.read_write_e32(),e.read_op8s()));break;case 7:e.cmp32(e.read_e32s(),e.read_op8s())}},t[132]=function(e){e.read_modrm_byte();var t=e.read_e8();e.test8(t,e.read_g8())},t16[133]=function(e){e.read_modrm_byte();var t=e.read_e16();e.test16(t,e.read_g16())},t32[133]=function(e){e.read_modrm_byte();var t=e.read_e32s();e.test32(t,e.read_g32s())},t[134]=function(e){e.read_modrm_byte();var t=e.read_write_e8();e.write_e8(e.xchg8(t,e.modrm_byte))},t16[135]=function(e){e.read_modrm_byte();var t=e.read_write_e16();e.write_e16(e.xchg16(t,e.modrm_byte))},t32[135]=function(e){e.read_modrm_byte();var t=e.read_write_e32()
;e.write_e32(e.xchg32(t,e.modrm_byte))},t[136]=function(e){e.read_modrm_byte(),e.set_e8(e.read_g8())},t16[137]=function(e){e.read_modrm_byte(),e.set_e16(e.read_g16())},t32[137]=function(e){e.read_modrm_byte(),e.set_e32(e.read_g32s())},t[138]=function(e){e.read_modrm_byte();var t=e.read_e8();e.write_g8(t)},t16[139]=function(e){e.read_modrm_byte();var t=e.read_e16();e.write_g16(t)},t32[139]=function(e){e.read_modrm_byte();var t=e.read_e32s();e.write_g32(t)},t16[140]=function(e){e.read_modrm_byte(),e.set_e16(e.sreg[e.modrm_byte>>3&7])},t32[140]=function(e){e.read_modrm_byte(),e.set_e32(e.sreg[e.modrm_byte>>3&7])},t16[141]=function(e){e.read_modrm_byte(),192<=e.modrm_byte&&(dbg_log("lea #ud",LOG_CPU),e.trigger_ud());var t=e.modrm_byte>>3&7;e.prefixes|=SEG_PREFIX_ZERO,e.reg16[t<<1]=e.modrm_resolve(e.modrm_byte),e.prefixes=0},t32[141]=function(e){e.read_modrm_byte(),192<=e.modrm_byte&&(dbg_log("lea #ud",LOG_CPU),e.trigger_ud());var t=e.modrm_byte>>3&7;e.prefixes|=SEG_PREFIX_ZERO,e.reg32s[t]=e.modrm_resolve(e.modrm_byte),e.prefixes=0},t[142]=function(e){e.read_modrm_byte();var t=e.modrm_byte>>3&7,s=e.read_e16();e.switch_seg(t,s),t===reg_ss&&(e.clear_prefixes(),e.cycle_internal())},t16[143]=function(e){e.read_modrm_byte();var t=e.safe_read16(e.get_stack_pointer(0));if(e.adjust_stack_reg(2),192>e.modrm_byte){var s=e.modrm_resolve(e.modrm_byte);e.adjust_stack_reg(-2),e.safe_write16(s,t),e.adjust_stack_reg(2)}else e.write_reg_e16(t)},t32[143]=function(e){e.read_modrm_byte();var t=e.safe_read32s(e.get_stack_pointer(0));if(e.adjust_stack_reg(4),192>e.modrm_byte){var s=e.modrm_resolve(e.modrm_byte);e.adjust_stack_reg(-4),e.safe_write32(s,t),e.adjust_stack_reg(4)}else e.write_reg_e32(t)},t[144]=function(e){},t16[145]=function(e){e.xchg16r(reg_cx)},t32[145]=function(e){e.xchg32r(reg_ecx)},t16[146]=function(e){e.xchg16r(reg_dx)},t32[146]=function(e){e.xchg32r(reg_edx)},t16[147]=function(e){e.xchg16r(reg_bx)},t32[147]=function(e){e.xchg32r(reg_ebx)},t16[148]=function(e){e.xchg16r(reg_sp)},t32[148]=function(e){e.xchg32r(reg_esp)},t16[149]=function(e){e.xchg16r(reg_bp)},t32[149]=function(e){e.xchg32r(reg_ebp)},t16[150]=function(e){e.xchg16r(reg_si)},t32[150]=function(e){e.xchg32r(reg_esi)},t16[151]=function(e){e.xchg16r(reg_di)},t32[151]=function(e){e.xchg32r(reg_edi)},t16[152]=function(e){e.reg16[reg_ax]=e.reg8s[reg_al]},t32[152]=function(e){e.reg32s[reg_eax]=e.reg16s[reg_ax]},t16[153]=function(e){e.reg16[reg_dx]=e.reg16s[reg_ax]>>15},t32[153]=function(e){e.reg32s[reg_edx]=e.reg32s[reg_eax]>>31},t16[154]=function(e){var t=e.read_op16(),s=e.read_disp16();e.far_jump(t,s,!0),dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged()},t32[154]=function(e){var t=e.read_op32s(),s=e.read_disp16();if((!e.protected_mode||e.vm86_mode())&&4294901760&t)throw e.debug.unimpl("#GP handler");e.far_jump(t,s,!0),dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged()},t[155]=function(e){(e.cr[0]&(CR0_MP|CR0_TS))==(CR0_MP|CR0_TS)?e.trigger_nm():e.fpu&&e.fpu.fwait()},t16[156]=function(e){e.flags&flag_vm&&3>e.getiopl()?(dbg_assert(e.protected_mode),dbg_log("pushf #gp",LOG_CPU),e.trigger_gp(0)):e.push16(e.get_eflags())},t32[156]=function(e){e.flags&flag_vm&&3>e.getiopl()?(dbg_assert(e.protected_mode),dbg_log("pushf #gp",LOG_CPU),e.trigger_gp(0)):e.push32(16580607&e.get_eflags())},t16[157]=function(e){e.flags&flag_vm&&3>e.getiopl()&&(dbg_log("popf #gp",LOG_CPU),e.trigger_gp(0)),e.update_eflags(-65536&e.flags|e.pop16()),e.flags&flag_trap?e.flags&=~flag_trap:e.handle_irqs()},t32[157]=function(e){e.flags&flag_vm&&3>e.getiopl()&&(dbg_log("popf #gp",LOG_CPU),e.trigger_gp(0)),e.update_eflags(e.pop32s()),e.handle_irqs()},t[158]=function(e){e.flags=-256&e.flags|e.reg8[reg_ah],e.flags=e.flags&flags_mask|flags_default,e.flags_changed=0},t[159]=function(e){e.reg8[reg_ah]=e.get_eflags()},t[160]=function(e){var t=e.safe_read8(e.read_moffs());e.reg8[reg_al]=t},t16[161]=function(e){var t=e.safe_read16(e.read_moffs());e.reg16[reg_ax]=t},t32[161]=function(e){var t=e.safe_read32s(e.read_moffs());e.reg32s[reg_eax]=t},t[162]=function(e){e.safe_write8(e.read_moffs(),e.reg8[reg_al])},t16[163]=function(e){e.safe_write16(e.read_moffs(),e.reg16[reg_ax])},t32[163]=function(e){e.safe_write32(e.read_moffs(),e.reg32s[reg_eax])},t[164]=function(e){e.movsb()},t16[165]=function(e){e.movsw()},t32[165]=function(e){e.movsd()},t[166]=function(e){cmpsb(e)},t16[167]=function(e){cmpsw(e)},t32[167]=function(e){cmpsd(e)},t[168]=function(e){e.test8(e.reg8[reg_al],e.read_op8())},t16[169]=function(e){e.test16(e.reg16[reg_ax],e.read_op16())},t32[169]=function(e){e.test32(e.reg32s[reg_eax],e.read_op32s())},t[170]=function(e){stosb(e)},t16[171]=function(e){stosw(e)},t32[171]=function(e){stosd(e)},t[172]=function(e){lodsb(e)},t16[173]=function(e){lodsw(e)},t32[173]=function(e){lodsd(e)},t[174]=function(e){scasb(e)},t16[175]=function(e){scasw(e)},t32[175]=function(e){scasd(e)},t[176]=function(e){e.reg8[reg_al]=e.read_op8()},t[177]=function(e){e.reg8[reg_cl]=e.read_op8()},t[178]=function(e){e.reg8[reg_dl]=e.read_op8()},t[179]=function(e){e.reg8[reg_bl]=e.read_op8()},t[180]=function(e){e.reg8[reg_ah]=e.read_op8()},t[181]=function(e){e.reg8[reg_ch]=e.read_op8()},t[182]=function(e){e.reg8[reg_dh]=e.read_op8()},t[183]=function(e){e.reg8[reg_bh]=e.read_op8()},t16[184]=function(e){e.reg16[reg_ax]=e.read_op16()},t32[184]=function(e){e.reg32s[reg_eax]=e.read_op32s()},t16[185]=function(e){e.reg16[reg_cx]=e.read_op16()},t32[185]=function(e){e.reg32s[reg_ecx]=e.read_op32s()},t16[186]=function(e){e.reg16[reg_dx]=e.read_op16()},t32[186]=function(e){e.reg32s[reg_edx]=e.read_op32s()},t16[187]=function(e){e.reg16[reg_bx]=e.read_op16()},t32[187]=function(e){e.reg32s[reg_ebx]=e.read_op32s()},t16[188]=function(e){e.reg16[reg_sp]=e.read_op16()},t32[188]=function(e){e.reg32s[reg_esp]=e.read_op32s()},t16[189]=function(e){e.reg16[reg_bp]=e.read_op16()},t32[189]=function(e){e.reg32s[reg_ebp]=e.read_op32s()},t16[190]=function(e){e.reg16[reg_si]=e.read_op16()},t32[190]=function(e){e.reg32s[reg_esi]=e.read_op32s()},t16[191]=function(e){e.reg16[reg_di]=e.read_op16()},t32[191]=function(e){e.reg32s[reg_edi]=e.read_op32s()},t[192]=function(e){e.read_modrm_byte();var t=e.read_write_e8(),s=31&e.read_op8(),r=0;switch(e.modrm_byte>>3&7){case 0:r=e.rol8(t,s);break;case 1:r=e.ror8(t,s);break;case 2:r=e.rcl8(t,s);break;case 3:r=e.rcr8(t,s);break;case 4:r=e.shl8(t,s);break;case 5:r=e.shr8(t,s);break;case 6:r=e.shl8(t,s);break;case 7:r=e.sar8(t,s)}e.write_e8(r)},t16[193]=function(e){e.read_modrm_byte();var t=e.read_write_e16(),s=31&e.read_op8(),r=0;switch(e.modrm_byte>>3&7){case 0:r=e.rol16(t,s);break;case 1:r=e.ror16(t,s);break;case 2:r=e.rcl16(t,s);break;case 3:r=e.rcr16(t,s);break;case 4:r=e.shl16(t,s);break;case 5:r=e.shr16(t,s);break;case 6:r=e.shl16(t,s);break;case 7:r=e.sar16(t,s)}e.write_e16(r)},t32[193]=function(e){e.read_modrm_byte();var t=e.read_write_e32(),s=31&e.read_op8(),r=0;switch(e.modrm_byte>>3&7){case 0:r=e.rol32(t,s);break;case 1:r=e.ror32(t,s);break;case 2:r=e.rcl32(t,s);break;case 3:r=e.rcr32(t,s);break;case 4:r=e.shl32(t,s);break;case 5:r=e.shr32(t,s);break;case 6:r=e.shl32(t,s);break;case 7:r=e.sar32(t,s)}e.write_e32(r)},t16[194]=function(e){var t=e.read_op16();e.instruction_pointer=e.get_seg(reg_cs)+e.pop16()|0,dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.adjust_stack_reg(t),e.diverged()},t32[194]=function(e){var t=e.read_op16(),s=e.pop32s();dbg_assert(e.is_asize_32()||65536>s),e.instruction_pointer=e.get_seg(reg_cs)+s|0,e.adjust_stack_reg(t),e.diverged()},t16[195]=function(e){e.instruction_pointer=e.get_seg(reg_cs)+e.pop16()|0,e.diverged()},t32[195]=function(e){var t=e.pop32s();dbg_assert(e.is_asize_32()||65536>t),e.instruction_pointer=e.get_seg(reg_cs)+t|0,e.diverged()},t16[196]=function(e){e.read_modrm_byte(),e.lss16(reg_es)},t32[196]=function(e){e.read_modrm_byte(),e.lss32(reg_es)},t16[197]=function(e){e.read_modrm_byte(),e.lss16(reg_ds)},t32[197]=function(e){e.read_modrm_byte(),e.lss32(reg_ds)},t[198]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.safe_write8(e.modrm_resolve(e.modrm_byte),e.read_op8()):e.reg8[e.modrm_byte<<2&12|e.modrm_byte>>2&1]=e.read_op8()},t16[199]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.safe_write16(e.modrm_resolve(e.modrm_byte),e.read_op16()):e.reg16[e.modrm_byte<<1&14]=e.read_op16()},t32[199]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.safe_write32(e.modrm_resolve(e.modrm_byte),e.read_op32s()):e.reg32s[7&e.modrm_byte]=e.read_op32s()},t16[200]=function(e){e.enter16(e.read_op16(),e.read_disp8())},t32[200]=function(e){e.enter32(e.read_op16(),e.read_disp8())},t16[201]=function(e){var t=e.stack_size_32?e.reg32s[reg_ebp]:e.reg16[reg_bp],s=e.safe_read16(e.get_seg(reg_ss)+t|0);e.set_stack_reg(t+2|0),e.reg16[reg_bp]=s},t32[201]=function(e){var t=e.stack_size_32?e.reg32s[reg_ebp]:e.reg16[reg_bp],s=e.safe_read32s(e.get_seg(reg_ss)+t|0);e.set_stack_reg(t+4|0),e.reg32s[reg_ebp]=s},t16[202]=function(e){var t=e.read_op16(),s=e.safe_read16(e.get_stack_pointer(0)),r=e.safe_read16(e.get_stack_pointer(2));e.far_return(s,r,t),e.diverged()},t32[202]=function(e){var t=e.read_op16(),s=e.safe_read32s(e.get_stack_pointer(0)),r=65535&e.safe_read32s(e.get_stack_pointer(4));e.far_return(s,r,t),dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged()},t16[203]=function(e){var t=e.safe_read16(e.get_stack_pointer(0)),s=e.safe_read16(e.get_stack_pointer(2));e.far_return(t,s,0),dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged()},t32[203]=function(e){var t=e.safe_read32s(e.get_stack_pointer(0)),s=65535&e.safe_read32s(e.get_stack_pointer(4));e.far_return(t,s,0),dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged()},t[204]=function(e){dbg_log("INT3",LOG_CPU),e.call_interrupt_vector(3,!0,!1),e.diverged()},t[205]=function(e){var t=e.read_op8();e.call_interrupt_vector(t,!0,!1),e.diverged()},t[206]=function(e){dbg_log("INTO",LOG_CPU),e.getof()&&e.call_interrupt_vector(4,!0,!1),e.diverged()},t16[207]=function(e){e.iret16(),e.diverged()},t32[207]=function(e){e.iret32(),e.diverged()},t[208]=function(e){e.read_modrm_byte();var t=e.read_write_e8(),s=0;switch(e.modrm_byte>>3&7){case 0:s=e.rol8(t,1);break;case 1:s=e.ror8(t,1);break;case 2:s=e.rcl8(t,1);break;case 3:s=e.rcr8(t,1);break;case 4:s=e.shl8(t,1);break;case 5:s=e.shr8(t,1);break;case 6:s=e.shl8(t,1);break;case 7:s=e.sar8(t,1)}e.write_e8(s)},t16[209]=function(e){e.read_modrm_byte();var t=e.read_write_e16(),s=0;switch(e.modrm_byte>>3&7){case 0:s=e.rol16(t,1);break;case 1:s=e.ror16(t,1);break;case 2:s=e.rcl16(t,1);break;case 3:s=e.rcr16(t,1);break;case 4:s=e.shl16(t,1);break;case 5:s=e.shr16(t,1);break;case 6:s=e.shl16(t,1);break;case 7:s=e.sar16(t,1)}e.write_e16(s)},t32[209]=function(e){e.read_modrm_byte();var t=e.read_write_e32(),s=0;switch(e.modrm_byte>>3&7){case 0:s=e.rol32(t,1);break;case 1:s=e.ror32(t,1);break;case 2:s=e.rcl32(t,1);break;case 3:s=e.rcr32(t,1);break;case 4:s=e.shl32(t,1);break;case 5:s=e.shr32(t,1);break;case 6:s=e.shl32(t,1);break;case 7:s=e.sar32(t,1)}e.write_e32(s)},t[210]=function(e){e.read_modrm_byte();var t=e.read_write_e8(),s=31&e.reg8[reg_cl],r=0;switch(e.modrm_byte>>3&7){case 0:r=e.rol8(t,s);break;case 1:r=e.ror8(t,s);break;case 2:r=e.rcl8(t,s);break;case 3:r=e.rcr8(t,s);break;case 4:r=e.shl8(t,s);break;case 5:r=e.shr8(t,s);break;case 6:r=e.shl8(t,s);break;case 7:r=e.sar8(t,s)}e.write_e8(r)},t16[211]=function(e){e.read_modrm_byte();var t=e.read_write_e16(),s=31&e.reg8[reg_cl],r=0;switch(e.modrm_byte>>3&7){case 0:r=e.rol16(t,s);break;case 1:r=e.ror16(t,s);break;case 2:r=e.rcl16(t,s);break;case 3:r=e.rcr16(t,s);break;case 4:r=e.shl16(t,s);break;case 5:r=e.shr16(t,s);break;case 6:r=e.shl16(t,s);break;case 7:r=e.sar16(t,s)}e.write_e16(r)},t32[211]=function(e){e.read_modrm_byte();var t=e.read_write_e32(),s=31&e.reg8[reg_cl],r=0;switch(e.modrm_byte>>3&7){case 0:r=e.rol32(t,s);break;case 1:r=e.ror32(t,s);break;case 2:r=e.rcl32(t,s);break;case 3:r=e.rcr32(t,s);break;case 4:r=e.shl32(t,s);break;case 5:r=e.shr32(t,s);break;case 6:r=e.shl32(t,s);break;case 7:r=e.sar32(t,s)}e.write_e32(r)},t[212]=function(e){e.bcd_aam(e.read_op8())},t[213]=function(e){e.bcd_aad(e.read_op8())},t[214]=function(e){e.reg8[reg_al]=-e.getcf()},t[215]=function(e){e.is_asize_32()?e.reg8[reg_al]=e.safe_read8(e.get_seg_prefix(reg_ds)+e.reg32s[reg_ebx]+e.reg8[reg_al]|0):e.reg8[reg_al]=e.safe_read8(e.get_seg_prefix(reg_ds)+(e.reg16[reg_bx]+e.reg8[reg_al]&65535)|0)},t[216]=function(e){e.read_modrm_byte(),e.task_switch_test(),192>e.modrm_byte?e.fpu.op_D8_mem(e.modrm_byte,e.modrm_resolve(e.modrm_byte)):e.fpu.op_D8_reg(e.modrm_byte)},t[217]=function(e){e.read_modrm_byte(),e.task_switch_test(),192>e.modrm_byte?e.fpu.op_D9_mem(e.modrm_byte,e.modrm_resolve(e.modrm_byte)):e.fpu.op_D9_reg(e.modrm_byte)},t[218]=function(e){e.read_modrm_byte(),e.task_switch_test(),192>e.modrm_byte?e.fpu.op_DA_mem(e.modrm_byte,e.modrm_resolve(e.modrm_byte)):e.fpu.op_DA_reg(e.modrm_byte)},t[219]=function(e){e.read_modrm_byte(),e.task_switch_test(),192>e.modrm_byte?e.fpu.op_DB_mem(e.modrm_byte,e.modrm_resolve(e.modrm_byte)):e.fpu.op_DB_reg(e.modrm_byte)},t[220]=function(e){e.read_modrm_byte(),e.task_switch_test(),192>e.modrm_byte?e.fpu.op_DC_mem(e.modrm_byte,e.modrm_resolve(e.modrm_byte)):e.fpu.op_DC_reg(e.modrm_byte)},t[221]=function(e){e.read_modrm_byte(),e.task_switch_test(),192>e.modrm_byte?e.fpu.op_DD_mem(e.modrm_byte,e.modrm_resolve(e.modrm_byte)):e.fpu.op_DD_reg(e.modrm_byte)},t[222]=function(e){e.read_modrm_byte(),e.task_switch_test(),192>e.modrm_byte?e.fpu.op_DE_mem(e.modrm_byte,e.modrm_resolve(e.modrm_byte)):e.fpu.op_DE_reg(e.modrm_byte)},t[223]=function(e){e.read_modrm_byte(),e.task_switch_test(),192>e.modrm_byte?e.fpu.op_DF_mem(e.modrm_byte,e.modrm_resolve(e.modrm_byte)):e.fpu.op_DF_reg(e.modrm_byte)},t[224]=function(e){e.loopne(e.read_op8s())},t[225]=function(e){e.loope(e.read_op8s())},t[226]=function(e){e.loop(e.read_op8s())},t[227]=function(e){e.jcxz(e.read_op8s())},t[228]=function(e){var t=e.read_op8();e.test_privileges_for_io(t,1),e.reg8[reg_al]=e.io.port_read8(t),e.diverged()},t16[229]=function(e){var t=e.read_op8();e.test_privileges_for_io(t,2),e.reg16[reg_ax]=e.io.port_read16(t),e.diverged()},t32[229]=function(e){var t=e.read_op8();e.test_privileges_for_io(t,4),e.reg32s[reg_eax]=e.io.port_read32(t),e.diverged()},t[230]=function(e){var t=e.read_op8();e.test_privileges_for_io(t,1),e.io.port_write8(t,e.reg8[reg_al]),e.diverged()},t16[231]=function(e){var t=e.read_op8();e.test_privileges_for_io(t,2),e.io.port_write16(t,e.reg16[reg_ax]),e.diverged()},t32[231]=function(e){var t=e.read_op8();e.test_privileges_for_io(t,4),e.io.port_write32(t,e.reg32s[reg_eax]),e.diverged()},t16[232]=function(e){var t=e.read_op16();e.push16(e.get_real_eip()),e.jmp_rel16(t),e.diverged()},t32[232]=function(e){var t=e.read_op32s();e.push32(e.get_real_eip()),e.instruction_pointer=e.instruction_pointer+t|0,dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged()},t16[233]=function(e){var t=e.read_op16();e.jmp_rel16(t),e.diverged()},t32[233]=function(e){var t=e.read_op32s();e.instruction_pointer=e.instruction_pointer+t|0,dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged()},t16[234]=function(e){var t=e.read_op16(),s=e.read_disp16();e.far_jump(t,s,!1),dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged()},t32[234]=function(e){var t=e.read_op32s(),s=e.read_disp16();e.far_jump(t,s,!1),dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged()},t[235]=function(e){var t=e.read_op8s();e.instruction_pointer=e.instruction_pointer+t|0,dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged()},t[236]=function(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,1),e.reg8[reg_al]=e.io.port_read8(t),e.diverged()},t16[237]=function(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,2),e.reg16[reg_ax]=e.io.port_read16(t),e.diverged()},t32[237]=function(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,4),e.reg32s[reg_eax]=e.io.port_read32(t),e.diverged()},t[238]=function(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,1),e.io.port_write8(t,e.reg8[reg_al]),e.diverged()},t16[239]=function(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,2),e.io.port_write16(t,e.reg16[reg_ax]),e.diverged()},t32[239]=function(e){var t=e.reg16[reg_dx];e.test_privileges_for_io(t,4),e.io.port_write32(t,e.reg32s[reg_eax]),e.diverged()},t[240]=function(e){e.run_prefix_instruction()},t[241]=function(e){throw e.debug.unimpl("int1 instruction")},t[242]=function(e){dbg_assert(0==(e.prefixes&PREFIX_MASK_REP)),e.prefixes|=PREFIX_REPNZ,e.run_prefix_instruction(),e.prefixes=0},t[243]=function(e){dbg_assert(0==(e.prefixes&PREFIX_MASK_REP)),e.prefixes|=PREFIX_REPZ,e.run_prefix_instruction(),e.prefixes=0},t[244]=function(e){e.hlt_op()},t[245]=function(e){e.flags=(1|e.flags)^e.getcf(),e.flags_changed&=-2},t[246]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 0:var t=e.read_e8();e.test8(t,e.read_op8());break;case 1:t=e.read_e8(),e.test8(t,e.read_op8());break;case 2:t=e.read_write_e8(),e.write_e8(~t);break;case 3:t=e.read_write_e8(),e.write_e8(e.neg8(t));break;case 4:t=e.read_e8(),e.mul8(t);break;case 5:t=e.read_e8s(),e.imul8(t);break;case 6:t=e.read_e8(),e.div8(t);break;case 7:t=e.read_e8s(),e.idiv8(t)}},t16[247]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 0:var t=e.read_e16();e.test16(t,e.read_op16());break;case 1:t=e.read_e16(),e.test16(t,e.read_op16());break;case 2:t=e.read_write_e16(),e.write_e16(~t);break;case 3:t=e.read_write_e16(),e.write_e16(e.neg16(t));break;case 4:t=e.read_e16(),e.mul16(t);break;case 5:t=e.read_e16s(),e.imul16(t);break;case 6:t=e.read_e16(),e.div16(t);break;case 7:t=e.read_e16s(),e.idiv16(t)}},t32[247]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 0:var t=e.read_e32s();e.test32(t,e.read_op32s());break;case 1:t=e.read_e32s(),e.test32(t,e.read_op32s());break;case 2:t=e.read_write_e32(),e.write_e32(~t);break;case 3:t=e.read_write_e32(),e.write_e32(e.neg32(t));break;case 4:t=e.read_e32(),e.mul32(t);break;case 5:t=e.read_e32s(),e.imul32(t);break;case 6:t=e.read_e32(),e.div32(t);break;case 7:t=e.read_e32s(),e.idiv32(t)}},t[248]=function(e){e.flags&=~flag_carry,e.flags_changed&=-2},t[249]=function(e){e.flags|=flag_carry,e.flags_changed&=-2},t[250]=function(e){!e.protected_mode||(e.flags&flag_vm?3===e.getiopl():e.getiopl()>=e.cpl)?e.flags&=~flag_interrupt:(dbg_log("cli #gp",LOG_CPU),e.trigger_gp(0))},t[251]=function(e){!e.protected_mode||(e.flags&flag_vm?3===e.getiopl():e.getiopl()>=e.cpl)?(e.flags|=flag_interrupt,e.clear_prefixes(),e.cycle_internal(),e.handle_irqs()):(dbg_log("sti #gp",LOG_CPU),e.trigger_gp(0))},t[252]=function(e){e.flags&=~flag_direction},t[253]=function(e){e.flags|=flag_direction},t[254]=function(e){e.read_modrm_byte();var t=56&e.modrm_byte;0===t?(t=e.read_write_e8(),e.write_e8(e.inc8(t))):8===t?(t=e.read_write_e8(),e.write_e8(e.dec8(t))):e.todo()},t16[255]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 0:var t=e.read_write_e16();e.write_e16(e.inc16(t));break;case 1:t=e.read_write_e16(),e.write_e16(e.dec16(t));break;case 2:t=e.read_e16(),e.push16(e.get_real_eip()),e.instruction_pointer=e.get_seg(reg_cs)+t|0,dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged();break;case 3:192<=e.modrm_byte&&(dbg_log("callf #ud",LOG_CPU),e.trigger_ud(),dbg_assert(!1,"unreachable"));var s=e.modrm_resolve(e.modrm_byte);t=e.safe_read16(s),s=e.safe_read16(s+2|0),e.far_jump(t,s,!0),dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged();break;case 4:t=e.read_e16(),e.instruction_pointer=e.get_seg(reg_cs)+t|0,dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged();break;case 5:192<=e.modrm_byte&&(dbg_log("jmpf #ud",LOG_CPU),e.trigger_ud(),dbg_assert(!1,"unreachable")),s=e.modrm_resolve(e.modrm_byte),t=e.safe_read16(s),s=e.safe_read16(s+2|0),e.far_jump(t,s,!1),dbg_assert(e.is_asize_32()||65536>e.get_real_eip()),e.diverged();break;case 6:t=e.read_e16(),e.push16(t);break;case 7:e.todo()}},t32[255]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 0:var t=e.read_write_e32();e.write_e32(e.inc32(t));break;case 1:t=e.read_write_e32(),e.write_e32(e.dec32(t));break;case 2:t=e.read_e32s(),e.push32(e.get_real_eip()),dbg_assert(e.is_asize_32()||65536>t),e.instruction_pointer=e.get_seg(reg_cs)+t|0,e.diverged();break;case 3:192<=e.modrm_byte&&(dbg_log("callf #ud",LOG_CPU),e.trigger_ud(),dbg_assert(!1,"unreachable"));var s=e.modrm_resolve(e.modrm_byte);if(t=e.safe_read32s(s),s=e.safe_read16(s+4|0),(!e.protected_mode||e.vm86_mode())&&4294901760&t)throw e.debug.unimpl("#GP handler");e.far_jump(t,s,!0),dbg_assert(e.is_asize_32()||65536>t),e.diverged();break;case 4:t=e.read_e32s(),dbg_assert(e.is_asize_32()||65536>t),e.instruction_pointer=e.get_seg(reg_cs)+t|0,e.diverged();break;case 5:if(192<=e.modrm_byte&&(dbg_log("jmpf #ud",LOG_CPU),e.trigger_ud(),dbg_assert(!1,"unreachable")),s=e.modrm_resolve(e.modrm_byte),t=e.safe_read32s(s),s=e.safe_read16(s+4|0),(!e.protected_mode||e.vm86_mode())&&4294901760&t)throw e.debug.unimpl("#GP handler");e.far_jump(t,s,!1),dbg_assert(e.is_asize_32()||65536>t),e.diverged();break;case 6:t=e.read_e32s(),e.push32(t);break;case 7:e.todo()}};var table16=[],table32=[];CPU.prototype.table16=table16,CPU.prototype.table32=table32;for(var i=0;256>i;i++)t[i]?table16[i]=table32[i]=t[i]:t16[i]&&(table16[i]=t16[i],table32[i]=t32[i]);t=[],t16=[],t32=[],t[0]=function(e){switch(e.read_modrm_byte(),e.protected_mode&&!e.vm86_mode()||(dbg_log("0f 00 #ud",LOG_CPU),e.trigger_ud()),e.modrm_byte>>3&7){case 0:e.set_e16(e.sreg[reg_ldtr]),e.is_osize_32()&&192<=e.modrm_byte&&(e.reg32s[7&e.modrm_byte]&=65535);break;case 1:e.set_e16(e.sreg[reg_tr]),e.is_osize_32()&&192<=e.modrm_byte&&(e.reg32s[7&e.modrm_byte]&=65535);break;case 2:e.cpl&&e.trigger_gp(0);var t=e.read_e16();e.load_ldt(t);break;case 3:e.cpl&&e.trigger_gp(0),t=e.read_e16(),e.load_tr(t);break;case 4:e.verr(e.read_e16());break;case 5:e.verw(e.read_e16());break;default:dbg_log(e.modrm_byte>>3&7,LOG_CPU),e.todo()}},t[1]=function(e){e.read_modrm_byte();var t=e.modrm_byte>>3&7;if(4===t)192<=e.modrm_byte&&e.is_osize_32()?e.set_e32(e.cr[0]):e.set_e16(e.cr[0]);else if(6===t){e.cpl&&e.trigger_gp(0);var s=e.read_e16();s=-16&e.cr[0]|15&s,e.protected_mode&&(s|=CR0_PE),e.set_cr0(s)}else switch(192<=e.modrm_byte&&(dbg_log("0f 01 #ud",LOG_CPU),e.trigger_ud()),s=e.modrm_resolve(e.modrm_byte),t){case 0:e.writable_or_pagefault(s,6),e.safe_write16(s,e.gdtr_size),t=e.is_osize_32()?-1:16777215,e.safe_write32(s+2,e.gdtr_offset&t);break;case 1:e.writable_or_pagefault(s,6),e.safe_write16(s,e.idtr_size),t=e.is_osize_32()?-1:16777215,e.safe_write32(s+2,e.idtr_offset&t);break;case 2:e.cpl&&e.trigger_gp(0),t=e.safe_read16(s),s=e.safe_read32s(s+2),e.gdtr_size=t,e.gdtr_offset=s,e.is_osize_32()||(e.gdtr_offset&=16777215);break;case 3:e.cpl&&e.trigger_gp(0),t=e.safe_read16(s),s=e.safe_read32s(s+2),e.idtr_size=t,e.idtr_offset=s,e.is_osize_32()||(e.idtr_offset&=16777215);break;case 7:e.cpl&&e.trigger_gp(0),e.invlpg(s);break;default:dbg_log(t),e.todo()}},t16[2]=function(e){e.read_modrm_byte(),e.protected_mode&&!e.vm86_mode()||(dbg_log("lar #ud",LOG_CPU),e.trigger_ud());var t=e.read_e16();e.write_g16(e.lar(t,e.read_g16()))},t32[2]=function(e){e.read_modrm_byte(),e.protected_mode&&!e.vm86_mode()||(dbg_log("lar #ud",LOG_CPU),e.trigger_ud());var t=e.read_e16();e.write_g32(e.lar(t,e.read_g32s()))},t16[3]=function(e){e.read_modrm_byte(),e.protected_mode&&!e.vm86_mode()||(dbg_log("lsl #ud",LOG_CPU),e.trigger_ud());var t=e.read_e16();e.write_g16(e.lsl(t,e.read_g16()))},t32[3]=function(e){e.read_modrm_byte(),e.protected_mode&&!e.vm86_mode()||(dbg_log("lsl #ud",LOG_CPU),e.trigger_ud());var t=e.read_e16();e.write_g32(e.lsl(t,e.read_g32s()))},t[4]=function(e){e.undefined_instruction()},t[5]=function(e){e.undefined_instruction()},t[6]=function(e){e.cpl?(dbg_log("clts #gp",LOG_CPU),e.trigger_gp(0)):e.cr[0]&=~CR0_TS},t[7]=function(e){e.undefined_instruction()},t[8]=function(e){e.todo()},t[9]=function(e){e.cpl&&(dbg_log("wbinvd #gp",LOG_CPU),e.trigger_gp(0))},t[10]=function(e){e.undefined_instruction()},t[11]=function(e){e.trigger_ud()},t[12]=function(e){e.undefined_instruction()},t[13]=function(e){e.todo()},t[14]=function(e){e.undefined_instruction()},t[15]=function(e){e.undefined_instruction()},t[16]=function(e){e.unimplemented_sse()},t[17]=function(e){e.unimplemented_sse()},t[18]=function(e){dbg_assert((e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_MASK_OPSIZE),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_xmm_mem64s();e.write_xmm64(t[0],t[1])},t[19]=function(e){dbg_assert((e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_MASK_OPSIZE),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_xmm64s();dbg_assert(192>e.modrm_byte);var s=e.modrm_resolve(e.modrm_byte);e.safe_write64(s,t[0],t[1])},t[20]=function(e){e.unimplemented_sse()},t[21]=function(e){e.unimplemented_sse()},t[22]=function(e){e.unimplemented_sse()},t[23]=function(e){e.unimplemented_sse()},t[24]=function(e){e.read_modrm_byte(),192>e.modrm_byte&&e.modrm_resolve(e.modrm_byte)},t[25]=function(e){e.unimplemented_sse()},t[26]=function(e){e.unimplemented_sse()},t[27]=function(e){e.unimplemented_sse()},t[28]=function(e){e.unimplemented_sse()},t[29]=function(e){e.unimplemented_sse()},t[30]=function(e){e.unimplemented_sse()},t[31]=function(e){e.read_modrm_byte(),192>e.modrm_byte&&e.modrm_resolve(e.modrm_byte)},t[32]=function(e){switch(e.read_modrm_byte(),e.cpl&&e.trigger_gp(0),e.modrm_byte>>3&7){case 0:e.write_reg_e32(e.cr[0]);break;case 2:e.write_reg_e32(e.cr[2]);break;case 3:e.write_reg_e32(e.cr[3]);break;case 4:e.write_reg_e32(e.cr[4]);break;default:dbg_log(e.modrm_byte>>3&7),dbg_assert(!1),e.trigger_ud()}},t[33]=function(e){e.read_modrm_byte(),e.cpl&&e.trigger_gp(0);var t=e.modrm_byte>>3&7;e.cr[4]&CR4_DE&&(4===t||5===t)&&(dbg_log("#ud mov dreg 4/5 with cr4.DE set",LOG_CPU),e.trigger_ud()),e.reg32s[7&e.modrm_byte]=e.dreg[t]},t[34]=function(e){e.read_modrm_byte(),e.cpl&&e.trigger_gp(0);var t=e.read_reg_e32s();switch(e.modrm_byte>>3&7){case 0:e.set_cr0(t);break;case 2:e.cr[2]=t;break;case 3:t&=-4072,dbg_assert(0==(4095&t),"TODO"),e.cr[3]=t,e.clear_tlb();break;case 4:e.set_cr4(t);break;default:dbg_log(e.modrm_byte>>3&7),dbg_assert(!1),e.trigger_ud()}},t[35]=function(e){e.read_modrm_byte(),e.cpl&&e.trigger_gp(0);var t=e.modrm_byte>>3&7;e.cr[4]&CR4_DE&&(4===t||5===t)&&(dbg_log("#ud mov dreg 4/5 with cr4.DE set",LOG_CPU),e.trigger_ud()),e.dreg[t]=e.read_reg_e32s()},t[36]=function(e){e.undefined_instruction()},t[37]=function(e){e.undefined_instruction()},t[38]=function(e){e.undefined_instruction()},t[39]=function(e){e.undefined_instruction()},t[40]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_xmm_mem128s();e.write_xmm128s(t[0],t[1],t[2],t[3])},t[41]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_MASK_OPSIZE){var t=e.read_xmm128s();dbg_assert(192>e.modrm_byte);var s=e.modrm_resolve(e.modrm_byte)}else dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_xmm128s(),dbg_assert(192>e.modrm_byte),s=e.modrm_resolve(e.modrm_byte);e.safe_write128(s,t[0],t[1],t[2],t[3])},t[42]=function(e){e.unimplemented_sse()},t[43]=function(e){e.unimplemented_sse()},t[44]=function(e){e.unimplemented_sse()},t[45]=function(e){e.unimplemented_sse()},t[46]=function(e){e.unimplemented_sse()},t[47]=function(e){e.unimplemented_sse()},t[48]=function(e){e.cpl&&e.trigger_gp(0);var t=e.reg32s[reg_ecx],s=e.reg32s[reg_eax],r=e.reg32s[reg_edx];switch(t!==IA32_SYSENTER_ESP&&dbg_log("wrmsr ecx="+h(t>>>0,8)+" data="+h(r>>>0,8)+":"+h(s>>>0,8),LOG_CPU),t){case IA32_SYSENTER_CS:e.sysenter_cs=65535&s;break;case IA32_SYSENTER_EIP:e.sysenter_eip=s;break;case IA32_SYSENTER_ESP:e.sysenter_esp=s;break;case IA32_APIC_BASE_MSR:dbg_assert(0===r,"Changing APIC address (high 32 bits) not supported"),dbg_assert((s&~(IA32_APIC_BASE_BSP|IA32_APIC_BASE_EXTD|IA32_APIC_BASE_EN))>>>0===APIC_ADDRESS,"Changing APIC address not supported"),dbg_assert(0==(s&IA32_APIC_BASE_EXTD),"x2apic not supported"),e.apic_enabled=(s&IA32_APIC_BASE_EN)===IA32_APIC_BASE_EN;break;case IA32_TIME_STAMP_COUNTER:t=(s>>>0)+4294967296*(r>>>0),e.tsc_offset=v86.microtick()-t/TSC_RATE;break;case IA32_BIOS_SIGN_ID:break;case IA32_MISC_ENABLE:dbg_log("IA32_MISC_ENABLE="+h(s>>>0,8),LOG_CPU);break;case IA32_MCG_CAP:break;case IA32_KERNEL_GS_BASE:dbg_log("GS Base written",LOG_CPU);break;default:dbg_assert(!1,"Unknown msr: "+h(t>>>0,8))}},t[49]=function(e){if(e.cpl&&e.cr[4]&CR4_TSD)e.trigger_gp(0);else{var t=v86.microtick()-e.tsc_offset;dbg_assert(isFinite(t),"non-finite tsc: "+t),e.reg32s[reg_eax]=t*TSC_RATE,e.reg32s[reg_edx]=TSC_RATE/4294967296*t}},t[50]=function(e){e.cpl&&e.trigger_gp(0);var t=e.reg32s[reg_ecx];dbg_log("rdmsr ecx="+h(t>>>0,8),LOG_CPU);var s=0,r=0;switch(t){case IA32_SYSENTER_CS:s=e.sysenter_cs;break;case IA32_SYSENTER_EIP:s=e.sysenter_eip;break;case IA32_SYSENTER_ESP:s=e.sysenter_esp;break;case IA32_TIME_STAMP_COUNTER:t=v86.microtick()-e.tsc_offset,s=t*TSC_RATE,r=TSC_RATE/4294967296*t;break;case IA32_PLATFORM_ID:break;case IA32_APIC_BASE_MSR:ENABLE_ACPI&&(s=APIC_ADDRESS,e.apic_enabled&&(s|=IA32_APIC_BASE_EN));break;case IA32_BIOS_SIGN_ID:break;case IA32_MISC_ENABLE:break;case IA32_RTIT_CTL:break;case MSR_SMI_COUNT:break;case IA32_MCG_CAP:break;case MSR_PKG_C2_RESIDENCY:break;case MSR_EBC_FREQUENCY_ID:s=16777216;break;default:dbg_assert(!1,"Unknown msr: "+h(t>>>0,8))}e.reg32s[reg_eax]=s,e.reg32s[reg_edx]=r},t[51]=function(e){e.todo()},t[52]=function(e){var t=65532&e.sysenter_cs;e.protected_mode&&0!==t||e.trigger_gp(0),e.flags=e.flags&~flag_vm&~flag_interrupt,e.instruction_pointer=e.sysenter_eip,e.reg32s[reg_esp]=e.sysenter_esp,e.sreg[reg_cs]=t,e.segment_is_null[reg_cs]=0,e.segment_limits[reg_cs]=-1,e.segment_offsets[reg_cs]=0,e.update_cs_size(!0),e.cpl=0,e.cpl_changed(),e.sreg[reg_ss]=t+8,e.segment_is_null[reg_ss]=0,e.segment_limits[reg_ss]=-1,e.segment_offsets[reg_ss]=0,e.stack_size_32=!0,e.diverged()},t[53]=function(e){var t=65532&e.sysenter_cs;e.protected_mode&&!e.cpl&&0!==t||e.trigger_gp(0),e.instruction_pointer=e.reg32s[reg_edx],e.reg32s[reg_esp]=e.reg32s[reg_ecx],e.sreg[reg_cs]=t+16|3,e.segment_is_null[reg_cs]=0,e.segment_limits[reg_cs]=-1,e.segment_offsets[reg_cs]=0,e.update_cs_size(!0),e.cpl=3,e.cpl_changed(),e.sreg[reg_ss]=t+24|3,e.segment_is_null[reg_ss]=0,e.segment_limits[reg_ss]=-1,e.segment_offsets[reg_ss]=0,e.stack_size_32=!0,e.diverged()},t[54]=function(e){e.undefined_instruction()},t[55]=function(e){e.todo()},t[56]=function(e){e.unimplemented_sse()},t[57]=function(e){e.unimplemented_sse()},t[58]=function(e){e.unimplemented_sse()},t[59]=function(e){e.unimplemented_sse()},t[60]=function(e){e.unimplemented_sse()},t[61]=function(e){e.unimplemented_sse()},t[62]=function(e){e.unimplemented_sse()},t[63]=function(e){e.unimplemented_sse()},t16[64]=function(e){e.read_modrm_byte(),e.cmovcc16(e.test_o())},t32[64]=function(e){e.read_modrm_byte(),e.cmovcc32(e.test_o())},t16[65]=function(e){e.read_modrm_byte(),e.cmovcc16(!e.test_o())},t32[65]=function(e){e.read_modrm_byte(),e.cmovcc32(!e.test_o())},t16[66]=function(e){e.read_modrm_byte(),e.cmovcc16(e.test_b())},t32[66]=function(e){e.read_modrm_byte(),e.cmovcc32(e.test_b())},t16[67]=function(e){e.read_modrm_byte(),e.cmovcc16(!e.test_b())},t32[67]=function(e){e.read_modrm_byte(),e.cmovcc32(!e.test_b())},t16[68]=function(e){e.read_modrm_byte(),e.cmovcc16(e.test_z())},t32[68]=function(e){e.read_modrm_byte(),e.cmovcc32(e.test_z())},t16[69]=function(e){e.read_modrm_byte(),e.cmovcc16(!e.test_z())},t32[69]=function(e){e.read_modrm_byte(),e.cmovcc32(!e.test_z())},t16[70]=function(e){e.read_modrm_byte(),e.cmovcc16(e.test_be())},t32[70]=function(e){e.read_modrm_byte(),e.cmovcc32(e.test_be())},t16[71]=function(e){e.read_modrm_byte(),e.cmovcc16(!e.test_be())},t32[71]=function(e){e.read_modrm_byte(),e.cmovcc32(!e.test_be())},t16[72]=function(e){e.read_modrm_byte(),
e.cmovcc16(e.test_s())},t32[72]=function(e){e.read_modrm_byte(),e.cmovcc32(e.test_s())},t16[73]=function(e){e.read_modrm_byte(),e.cmovcc16(!e.test_s())},t32[73]=function(e){e.read_modrm_byte(),e.cmovcc32(!e.test_s())},t16[74]=function(e){e.read_modrm_byte(),e.cmovcc16(e.test_p())},t32[74]=function(e){e.read_modrm_byte(),e.cmovcc32(e.test_p())},t16[75]=function(e){e.read_modrm_byte(),e.cmovcc16(!e.test_p())},t32[75]=function(e){e.read_modrm_byte(),e.cmovcc32(!e.test_p())},t16[76]=function(e){e.read_modrm_byte(),e.cmovcc16(e.test_l())},t32[76]=function(e){e.read_modrm_byte(),e.cmovcc32(e.test_l())},t16[77]=function(e){e.read_modrm_byte(),e.cmovcc16(!e.test_l())},t32[77]=function(e){e.read_modrm_byte(),e.cmovcc32(!e.test_l())},t16[78]=function(e){e.read_modrm_byte(),e.cmovcc16(e.test_le())},t32[78]=function(e){e.read_modrm_byte(),e.cmovcc32(e.test_le())},t16[79]=function(e){e.read_modrm_byte(),e.cmovcc16(!e.test_le())},t32[79]=function(e){e.read_modrm_byte(),e.cmovcc32(!e.test_le())},t[80]=function(e){e.unimplemented_sse()},t[81]=function(e){e.unimplemented_sse()},t[82]=function(e){e.unimplemented_sse()},t[83]=function(e){e.unimplemented_sse()},t[84]=function(e){e.unimplemented_sse()},t[85]=function(e){e.unimplemented_sse()},t[86]=function(e){e.unimplemented_sse()},t[87]=function(e){e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_xmm_mem128s(),s=e.read_xmm128s();e.write_xmm128s(t[0]^s[0],t[1]^s[1],t[2]^s[2],t[3]^s[3])},t[88]=function(e){e.unimplemented_sse()},t[89]=function(e){e.unimplemented_sse()},t[90]=function(e){e.unimplemented_sse()},t[91]=function(e){e.unimplemented_sse()},t[92]=function(e){e.unimplemented_sse()},t[93]=function(e){e.unimplemented_sse()},t[94]=function(e){e.unimplemented_sse()},t[95]=function(e){e.unimplemented_sse()},t[96]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem64s();t=new Uint8Array(t.buffer);var s=e.read_xmm64s();s=new Uint8Array(s.buffer),e.write_xmm128s(s[0]|t[0]<<8|s[1]<<16|t[1]<<24,s[2]|t[2]<<8|s[3]<<16|t[3]<<24,s[4]|t[4]<<8|s[5]<<16|t[5]<<24,s[6]|t[6]<<8|s[7]<<16|t[7]<<24)}else dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem32s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],e.write_mmx64s(255&s|(255&t)<<8|(s>>8&255)<<16|(t>>8&255)<<24,s>>16&255|(t>>16&255)<<8|s>>>24<<16|t>>>24<<24)},t[97]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem64s();t=new Uint16Array(t.buffer);var s=e.read_xmm64s();s=new Uint16Array(s.buffer),e.write_xmm128s(s[0]|t[0]<<16,s[1]|t[1]<<16,s[2]|t[2]<<16,s[3]|t[3]<<16)}else dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem32s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],e.write_mmx64s(65535&s|(65535&t)<<16,s>>>16|t>>>16<<16)},t[98]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem32s();e.write_mmx64s(e.reg_mmxs[2*(e.modrm_byte>>3&7)],t)},t[99]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1],i=0|e.saturate_sw_to_sb(65535&s);i|=e.saturate_sw_to_sb(s>>>16)<<8,i|=e.saturate_sw_to_sb(65535&r)<<16,i|=e.saturate_sw_to_sb(r>>>16)<<24,s=0|e.saturate_sw_to_sb(65535&t[0]),s|=e.saturate_sw_to_sb(t[0]>>>16)<<8,s|=e.saturate_sw_to_sb(65535&t[1])<<16,s|=e.saturate_sw_to_sb(t[1]>>>16)<<24,e.write_mmx64s(i,s)},t[100]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s();t=new Int8Array(t.buffer);var s=8*(e.modrm_byte>>3&7),r=e.reg_mmx8s;e.write_mmx64s((r[s]>t[0]?255:0)|(r[s+1]>t[1]?255:0)<<8|(r[s+2]>t[2]?255:0)<<16|(r[s+3]>t[3]?255:0)<<24,(r[s+4]>t[4]?255:0)|(r[s+5]>t[5]?255:0)<<8|(r[s+6]>t[6]?255:0)<<16|(r[s+7]>t[7]?255:0)<<24)},t[101]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];e.write_mmx64s((s<<16>>16>t[0]<<16>>16?65535:0)|(s>>16>t[0]>>16?65535:0)<<16,(r<<16>>16>t[1]<<16>>16?65535:0)|(r>>16>t[1]>>16?65535:0)<<16)},t[102]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s();e.write_mmx64s(e.reg_mmxs[2*(e.modrm_byte>>3&7)]>t[0]?-1:0,e.reg_mmxs[2*(e.modrm_byte>>3&7)+1]>t[1]?-1:0)},t[103]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s();t=new Int16Array(t.buffer);var s=e.read_xmm128s();s=new Int16Array(s.buffer);for(var r=e.create_atom128s(0,0,0,0),i=new Uint8Array(r.buffer),_=0;8>_;_++)i[_]=e.saturate_sw_to_ub(s[_]),i[8|_]=e.saturate_sw_to_ub(t[_]);e.write_xmm128s(r[0],r[1],r[2],r[3])}else dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem64s(),r=e.reg_mmxs[2*(e.modrm_byte>>3&7)],i=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1],s=0|e.saturate_sw_to_ub(65535&r),s|=e.saturate_sw_to_ub(r>>>16)<<8,s|=e.saturate_sw_to_ub(65535&i)<<16,s|=e.saturate_sw_to_ub(i>>>16)<<24,r=0|e.saturate_sw_to_ub(65535&t[0]),r|=e.saturate_sw_to_ub(t[0]>>>16)<<8,r|=e.saturate_sw_to_ub(65535&t[1])<<16,r|=e.saturate_sw_to_ub(t[1]>>>16)<<24,e.write_mmx64s(s,r)},t[104]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s();t=new Uint8Array(t.buffer);var s=e.read_xmm128s();s=new Uint8Array(s.buffer),e.write_xmm128s(s[8]|t[8]<<8|s[9]<<16|t[9]<<24,s[10]|t[10]<<8|s[11]<<16|t[11]<<24,s[12]|t[12]<<8|s[13]<<16|t[13]<<24,s[14]|t[14]<<8|s[15]<<16|t[15]<<24)}else dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1],e.write_mmx64s(255&s|(255&t[1])<<8|(s>>8&255)<<16|(t[1]>>8&255)<<24,s>>16&255|(t[1]>>16&255)<<8|s>>>24<<16|t[1]>>>24<<24)},t[105]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];e.write_mmx64s(65535&s|(65535&t[1])<<16,s>>>16|t[1]>>>16<<16)},t[106]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s();e.write_mmx64s(e.reg_mmxs[2*(e.modrm_byte>>3&7)+1],t[1])},t[107]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1],r=0|e.saturate_sd_to_sw(e.reg_mmxs[2*(e.modrm_byte>>3&7)]);r|=e.saturate_sd_to_sw(s)<<16,s=0|e.saturate_sd_to_sw(t[0]),s|=e.saturate_sd_to_sw(t[1])<<16,e.write_mmx64s(r,s)},t[108]=function(e){e.unimplemented_sse()},t[109]=function(e){e.unimplemented_sse()},t[110]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_MASK_OPSIZE){var t=e.read_e32s();e.write_xmm128s(t,0,0,0)}else dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_e32s(),e.write_mmx64s(t,0)},t[111]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s();e.write_xmm128s(t[0],t[1],t[2],t[3])}else(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_REPZ?(t=e.read_xmm_mem128s_unaligned(),e.write_xmm128s(t[0],t[1],t[2],t[3])):(dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem64s(),e.write_mmx64s(t[0],t[1]))},t[112]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s(),s=e.read_op8();e.write_xmm128s(t[3&s],t[s>>2&3],t[s>>4&3],t[s>>6&3])}else if((e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_REPNZ){t=e.read_xmm_mem128s(),s=new Uint16Array(t.buffer);var r=e.read_op8();e.write_xmm128s(s[3&r]|s[r>>2&3]<<16,s[r>>4&3]|s[r>>6&3]<<16,t[2],t[3])}else if((e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_REPZ)t=e.read_xmm_mem128s(),s=new Uint16Array(t.buffer),r=e.read_op8(),e.write_xmm128s(t[0],t[1],s[3&r|4]|s[r>>2&3|4]<<16,s[r>>4&3|4]|s[r>>6&3|4]<<16);else{dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem64s();var i=e.read_op8();s=3&i,r=i>>2&3;var _=i>>4&3;i>>>=6,e.write_mmx64s(t[s>>1]>>>16*(1&s)&65535|t[r>>1]>>>16*(1&r)<<16,t[_>>1]>>>16*(1&_)&65535|t[i>>1]>>>16*(1&i)<<16)}},t[113]=function(e){switch(e.read_modrm_byte(),dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),192>e.modrm_byte&&e.trigger_ud(),e.modrm_byte>>3&7){case 2:var t=e.read_op8(),s=7&e.modrm_byte,r=e.reg_mmxs[2*s],i=e.reg_mmxs[2*s+1],_=0,a=0;15>=t&&(_=(65535&r)>>>t|r>>>16>>>t<<16,a=(65535&i)>>>t|i>>>16>>>t<<16),e.reg_mmxs[2*s]=_,e.reg_mmxs[2*s+1]=a;break;case 4:t=e.read_op8(),s=7&e.modrm_byte,r=e.reg_mmxs[2*s],i=e.reg_mmxs[2*s+1],15<t&&(t=16),e.reg_mmxs[2*s]=r<<16>>16>>t&65535|(r>>16>>t&65535)<<16,e.reg_mmxs[2*s+1]=i<<16>>16>>t&65535|(i>>16>>t&65535)<<16;break;case 6:t=e.read_op8(),s=7&e.modrm_byte,r=e.reg_mmxs[2*s],i=e.reg_mmxs[2*s+1],a=_=0,15>=t&&(_=(65535&r)<<t&65535|r>>>16<<t<<16,a=(65535&i)<<t&65535|i>>>16<<t<<16),e.reg_mmxs[2*s]=_,e.reg_mmxs[2*s+1]=a;break;default:e.unimplemented_sse()}},t[114]=function(e){switch(e.read_modrm_byte(),dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),192>e.modrm_byte&&e.trigger_ud(),e.modrm_byte>>3&7){case 2:var t=e.read_op8(),s=7&e.modrm_byte,r=e.reg_mmxs[2*s],i=e.reg_mmxs[2*s+1],_=0,a=0;31>=t&&(_=r>>>t,a=i>>>t),e.reg_mmxs[2*s]=_,e.reg_mmxs[2*s+1]=a;break;case 4:t=e.read_op8(),s=7&e.modrm_byte,r=e.reg_mmxs[2*s],i=e.reg_mmxs[2*s+1],31<t&&(t=31),e.reg_mmxs[2*s]=r>>t,e.reg_mmxs[2*s+1]=i>>t;break;case 6:t=e.read_op8(),s=7&e.modrm_byte,r=e.reg_mmxs[2*s],i=e.reg_mmxs[2*s+1],a=_=0,31>=t&&(_=r<<t,a=i<<t),e.reg_mmxs[2*s]=_,e.reg_mmxs[2*s+1]=a;break;default:e.unimplemented_sse()}},t[115]=function(e){switch(e.read_modrm_byte(),dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),192>e.modrm_byte&&e.trigger_ud(),e.modrm_byte>>3&7){case 2:var t=e.read_op8(),s=7&e.modrm_byte,r=e.reg_mmxs[2*s],i=e.reg_mmxs[2*s+1],_=0,a=0;31>=t?(_=r>>>t|i<<32-t,a=i>>>t):63>=t&&(_=i>>>(31&t),a=0),e.reg_mmxs[2*s]=_,e.reg_mmxs[2*s+1]=a;break;case 6:t=e.read_op8(),s=7&e.modrm_byte,r=e.reg_mmxs[2*s],i=e.reg_mmxs[2*s+1],a=_=0,31>=t?(_=r<<t,a=i<<t|r>>>32-t):63>=t&&(a=r<<(31&t),_=0),e.reg_mmxs[2*s]=_,e.reg_mmxs[2*s+1]=a;break;default:e.unimplemented_sse()}},t[116]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s();t=new Uint8Array(t.buffer);var s=e.read_xmm128s();s=new Uint8Array(s.buffer);for(var r=e.create_atom128s(0,0,0,0),i=new Uint8Array(r.buffer),_=0;16>_;_++)i[_]=t[_]===s[_]?255:0;e.write_xmm128s(r[0],r[1],r[2],r[3])}else dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem64s(),t=new Int8Array(t.buffer),s=8*(e.modrm_byte>>3&7),r=e.reg_mmx8s,e.write_mmx64s((r[s]===t[0]?255:0)|(r[s+1]===t[1]?255:0)<<8|(r[s+2]===t[2]?255:0)<<16|(r[s+3]===t[3]?255:0)<<24,(r[s+4]===t[4]?255:0)|(r[s+5]===t[5]?255:0)<<8|(r[s+6]===t[6]?255:0)<<16|(r[s+7]===t[7]?255:0)<<24)},t[117]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];e.write_mmx64s(((65535&s)==(65535&t[0])?65535:0)|((4294901760&s)==(4294901760&t[0])?65535:0)<<16,((65535&r)==(65535&t[1])?65535:0)|((4294901760&r)==(4294901760&t[1])?65535:0)<<16)},t[118]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s(),s=e.read_xmm128s();e.write_xmm128s(t[0]===s[0]?-1:0,t[1]===s[1]?-1:0,t[2]===s[2]?-1:0,t[3]===s[3]?-1:0)}else dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem64s(),e.write_mmx64s(e.reg_mmxs[2*(e.modrm_byte>>3&7)]===t[0]?-1:0,e.reg_mmxs[2*(e.modrm_byte>>3&7)+1]===t[1]?-1:0)},t[119]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.fpu.stack_empty=255},t[120]=function(e){e.unimplemented_sse()},t[121]=function(e){e.unimplemented_sse()},t[122]=function(e){e.unimplemented_sse()},t[123]=function(e){e.unimplemented_sse()},t[124]=function(e){e.unimplemented_sse()},t[125]=function(e){e.unimplemented_sse()},t[126]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_REPZ){var t=e.read_xmm_mem64s();e.write_xmm128s(t[0],t[1],0,0)}else(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE?t=e.read_xmm64s():(dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx64s()),e.set_e32(t[0])},t[127]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_REPZ){var t=e.read_xmm128s();dbg_assert(192>e.modrm_byte);var s=e.modrm_resolve(e.modrm_byte);e.safe_write128(s,t[0],t[1],t[2],t[3])}else(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE?(t=e.read_xmm128s(),dbg_assert(192>e.modrm_byte),s=e.modrm_resolve(e.modrm_byte),e.safe_write128(s,t[0],t[1],t[2],t[3])):(dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx64s(),e.set_mmx_mem64s(t[0],t[1]))},t16[128]=function(e){e.jmpcc16(e.test_o())},t32[128]=function(e){e.jmpcc32(e.test_o())},t16[129]=function(e){e.jmpcc16(!e.test_o())},t32[129]=function(e){e.jmpcc32(!e.test_o())},t16[130]=function(e){e.jmpcc16(e.test_b())},t32[130]=function(e){e.jmpcc32(e.test_b())},t16[131]=function(e){e.jmpcc16(!e.test_b())},t32[131]=function(e){e.jmpcc32(!e.test_b())},t16[132]=function(e){e.jmpcc16(e.test_z())},t32[132]=function(e){e.jmpcc32(e.test_z())},t16[133]=function(e){e.jmpcc16(!e.test_z())},t32[133]=function(e){e.jmpcc32(!e.test_z())},t16[134]=function(e){e.jmpcc16(e.test_be())},t32[134]=function(e){e.jmpcc32(e.test_be())},t16[135]=function(e){e.jmpcc16(!e.test_be())},t32[135]=function(e){e.jmpcc32(!e.test_be())},t16[136]=function(e){e.jmpcc16(e.test_s())},t32[136]=function(e){e.jmpcc32(e.test_s())},t16[137]=function(e){e.jmpcc16(!e.test_s())},t32[137]=function(e){e.jmpcc32(!e.test_s())},t16[138]=function(e){e.jmpcc16(e.test_p())},t32[138]=function(e){e.jmpcc32(e.test_p())},t16[139]=function(e){e.jmpcc16(!e.test_p())},t32[139]=function(e){e.jmpcc32(!e.test_p())},t16[140]=function(e){e.jmpcc16(e.test_l())},t32[140]=function(e){e.jmpcc32(e.test_l())},t16[141]=function(e){e.jmpcc16(!e.test_l())},t32[141]=function(e){e.jmpcc32(!e.test_l())},t16[142]=function(e){e.jmpcc16(e.test_le())},t32[142]=function(e){e.jmpcc32(e.test_le())},t16[143]=function(e){e.jmpcc16(!e.test_le())},t32[143]=function(e){e.jmpcc32(!e.test_le())},t[144]=function(e){e.read_modrm_byte(),e.setcc(e.test_o())},t[145]=function(e){e.read_modrm_byte(),e.setcc(!e.test_o())},t[146]=function(e){e.read_modrm_byte(),e.setcc(e.test_b())},t[147]=function(e){e.read_modrm_byte(),e.setcc(!e.test_b())},t[148]=function(e){e.read_modrm_byte(),e.setcc(e.test_z())},t[149]=function(e){e.read_modrm_byte(),e.setcc(!e.test_z())},t[150]=function(e){e.read_modrm_byte(),e.setcc(e.test_be())},t[151]=function(e){e.read_modrm_byte(),e.setcc(!e.test_be())},t[152]=function(e){e.read_modrm_byte(),e.setcc(e.test_s())},t[153]=function(e){e.read_modrm_byte(),e.setcc(!e.test_s())},t[154]=function(e){e.read_modrm_byte(),e.setcc(e.test_p())},t[155]=function(e){e.read_modrm_byte(),e.setcc(!e.test_p())},t[156]=function(e){e.read_modrm_byte(),e.setcc(e.test_l())},t[157]=function(e){e.read_modrm_byte(),e.setcc(!e.test_l())},t[158]=function(e){e.read_modrm_byte(),e.setcc(e.test_le())},t[159]=function(e){e.read_modrm_byte(),e.setcc(!e.test_le())},t16[160]=function(e){e.push16(e.sreg[reg_fs])},t32[160]=function(e){e.push32(e.sreg[reg_fs])},t16[161]=function(e){e.switch_seg(reg_fs,e.safe_read16(e.get_stack_pointer(0))),e.adjust_stack_reg(2)};t32[161]=function(e){e.switch_seg(reg_fs,65535&e.safe_read32s(e.get_stack_pointer(0))),e.adjust_stack_reg(4)},t[162]=function(e){e.cpuid()},t16[163]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.bt_mem(e.modrm_resolve(e.modrm_byte),e.read_g16s()):e.bt_reg(e.read_reg_e16(),15&e.read_g16())},t32[163]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.bt_mem(e.modrm_resolve(e.modrm_byte),e.read_g32s()):e.bt_reg(e.read_reg_e32s(),31&e.read_g32s())},t16[164]=function(e){e.read_modrm_byte();var t=e.read_write_e16();e.write_e16(e.shld16(t,e.read_g16(),31&e.read_op8()))},t32[164]=function(e){e.read_modrm_byte();var t=e.read_write_e32();e.write_e32(e.shld32(t,e.read_g32s(),31&e.read_op8()))},t16[165]=function(e){e.read_modrm_byte();var t=e.read_write_e16();e.write_e16(e.shld16(t,e.read_g16(),31&e.reg8[reg_cl]))},t32[165]=function(e){e.read_modrm_byte();var t=e.read_write_e32();e.write_e32(e.shld32(t,e.read_g32s(),31&e.reg8[reg_cl]))},t[166]=function(e){e.trigger_ud()},t[167]=function(e){e.undefined_instruction()},t16[168]=function(e){e.push16(e.sreg[reg_gs])},t32[168]=function(e){e.push32(e.sreg[reg_gs])},t16[169]=function(e){e.switch_seg(reg_gs,e.safe_read16(e.get_stack_pointer(0))),e.adjust_stack_reg(2)},t32[169]=function(e){e.switch_seg(reg_gs,65535&e.safe_read32s(e.get_stack_pointer(0))),e.adjust_stack_reg(4)},t[170]=function(e){e.todo()},t16[171]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.bts_mem(e.modrm_resolve(e.modrm_byte),e.read_g16s()):e.write_reg_e16(e.bts_reg(e.read_reg_e16(),15&e.read_g16s()))},t32[171]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.bts_mem(e.modrm_resolve(e.modrm_byte),e.read_g32s()):e.write_reg_e32(e.bts_reg(e.read_reg_e32s(),31&e.read_g32s()))},t16[172]=function(e){e.read_modrm_byte();var t=e.read_write_e16();e.write_e16(e.shrd16(t,e.read_g16(),31&e.read_op8()))},t32[172]=function(e){e.read_modrm_byte();var t=e.read_write_e32();e.write_e32(e.shrd32(t,e.read_g32s(),31&e.read_op8()))},t16[173]=function(e){e.read_modrm_byte();var t=e.read_write_e16();e.write_e16(e.shrd16(t,e.read_g16(),31&e.reg8[reg_cl]))},t32[173]=function(e){e.read_modrm_byte();var t=e.read_write_e32();e.write_e32(e.shrd32(t,e.read_g32s(),31&e.reg8[reg_cl]))},t[174]=function(e){switch(e.read_modrm_byte(),e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE)&&e.todo(),e.modrm_byte>>3&7){case 0:192<=e.modrm_byte&&e.trigger_ud();var t=e.modrm_resolve(e.modrm_byte);e.fxsave(t);break;case 1:192<=e.modrm_byte&&e.trigger_ud(),t=e.modrm_resolve(e.modrm_byte),e.fxrstor(t);break;case 2:192<=e.modrm_byte&&e.trigger_ud(),t=e.modrm_resolve(e.modrm_byte),t=e.safe_read32s(t),t&~MXCSR_MASK&&(dbg_log("Invalid mxcsr bits: "+h((t&~MXCSR_MASK)>>>0,8)),e.trigger_gp(0)),e.mxcsr=t;break;case 3:192<=e.modrm_byte&&e.trigger_ud(),t=e.modrm_resolve(e.modrm_byte),e.safe_write32(t,e.mxcsr);break;case 5:dbg_assert(192<=e.modrm_byte,"Unexpected lfence encoding"),192>e.modrm_byte&&e.trigger_ud();break;case 6:dbg_assert(192<=e.modrm_byte,"Unexpected mfence encoding"),192>e.modrm_byte&&e.trigger_ud();break;case 7:dbg_assert(192<=e.modrm_byte,"Unexpected sfence encoding"),192>e.modrm_byte&&e.trigger_ud();break;default:dbg_log("missing "+(e.modrm_byte>>3&7),LOG_CPU),e.todo()}},t16[175]=function(e){e.read_modrm_byte();var t=e.read_e16s();e.write_g16(e.imul_reg16(e.read_g16s(),t))},t32[175]=function(e){e.read_modrm_byte();var t=e.read_e32s();e.write_g32(e.imul_reg32(e.read_g32s(),t))},t[176]=function(e){if(e.read_modrm_byte(),192>e.modrm_byte){var t=e.modrm_resolve(e.modrm_byte);e.writable_or_pagefault(t,1);var s=e.safe_read8(t)}else s=e.reg8[e.modrm_byte<<2&12|e.modrm_byte>>2&1];e.cmp8(e.reg8[reg_al],s),e.getzf()?192>e.modrm_byte?e.safe_write8(t,e.read_g8()):e.reg8[e.modrm_byte<<2&12|e.modrm_byte>>2&1]=e.read_g8():(192>e.modrm_byte&&e.safe_write8(t,s),e.reg8[reg_al]=s)},t16[177]=function(e){if(e.read_modrm_byte(),192>e.modrm_byte){var t=e.modrm_resolve(e.modrm_byte);e.writable_or_pagefault(t,2);var s=e.safe_read16(t)}else s=e.read_reg_e16();e.cmp16(e.reg16[reg_ax],s),e.getzf()?192>e.modrm_byte?e.safe_write16(t,e.read_g16()):e.write_reg_e16(e.read_g16()):(192>e.modrm_byte&&e.safe_write16(t,s),e.reg16[reg_ax]=s)},t32[177]=function(e){if(e.read_modrm_byte(),192>e.modrm_byte){var t=e.modrm_resolve(e.modrm_byte);e.writable_or_pagefault(t,4);var s=e.safe_read32s(t)}else s=e.read_reg_e32s();e.cmp32(e.reg32s[reg_eax],s),e.getzf()?192>e.modrm_byte?e.safe_write32(t,e.read_g32s()):e.write_reg_e32(e.read_g32s()):(192>e.modrm_byte&&e.safe_write32(t,s),e.reg32s[reg_eax]=s)},t16[178]=function(e){e.read_modrm_byte(),e.lss16(reg_ss)},t32[178]=function(e){e.read_modrm_byte(),e.lss32(reg_ss)},t16[179]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.btr_mem(e.modrm_resolve(e.modrm_byte),e.read_g16s()):e.write_reg_e16(e.btr_reg(e.read_reg_e16(),15&e.read_g16s()))},t32[179]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.btr_mem(e.modrm_resolve(e.modrm_byte),e.read_g32s()):e.write_reg_e32(e.btr_reg(e.read_reg_e32s(),31&e.read_g32s()))},t16[180]=function(e){e.read_modrm_byte(),e.lss16(reg_fs)},t32[180]=function(e){e.read_modrm_byte(),e.lss32(reg_fs)},t16[181]=function(e){e.read_modrm_byte(),e.lss16(reg_gs)},t32[181]=function(e){e.read_modrm_byte(),e.lss32(reg_gs)},t16[182]=function(e){e.read_modrm_byte();var t=e.read_e8();e.write_g16(t)},t32[182]=function(e){e.read_modrm_byte();var t=e.read_e8();e.write_g32(t)},t16[183]=function(e){e.read_modrm_byte(),dbg_assert(!1,"Possibly invalid encoding");var t=e.read_e16();e.write_g16(t)},t32[183]=function(e){e.read_modrm_byte();var t=e.read_e16();e.write_g32(t)},t16[184]=function(e){e.read_modrm_byte(),0==(e.prefixes&PREFIX_REPZ)&&e.trigger_ud();var t=e.read_e16();e.write_g16(e.popcnt(t))},t32[184]=function(e){e.read_modrm_byte(),0==(e.prefixes&PREFIX_REPZ)&&e.trigger_ud();var t=e.read_e32s();e.write_g32(e.popcnt(t))},t[185]=function(e){e.todo()},t16[186]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 4:192>e.modrm_byte?e.bt_mem(e.modrm_resolve(e.modrm_byte),15&e.read_op8()):e.bt_reg(e.read_reg_e16(),15&e.read_op8());break;case 5:192>e.modrm_byte?e.bts_mem(e.modrm_resolve(e.modrm_byte),15&e.read_op8()):e.write_reg_e16(e.bts_reg(e.read_reg_e16(),15&e.read_op8()));break;case 6:192>e.modrm_byte?e.btr_mem(e.modrm_resolve(e.modrm_byte),15&e.read_op8()):e.write_reg_e16(e.btr_reg(e.read_reg_e16(),15&e.read_op8()));break;case 7:192>e.modrm_byte?e.btc_mem(e.modrm_resolve(e.modrm_byte),15&e.read_op8()):e.write_reg_e16(e.btc_reg(e.read_reg_e16(),15&e.read_op8()));break;default:dbg_log(e.modrm_byte>>3&7),e.todo()}},t32[186]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 4:192>e.modrm_byte?e.bt_mem(e.modrm_resolve(e.modrm_byte),31&e.read_op8()):e.bt_reg(e.read_reg_e32s(),31&e.read_op8());break;case 5:192>e.modrm_byte?e.bts_mem(e.modrm_resolve(e.modrm_byte),31&e.read_op8()):e.write_reg_e32(e.bts_reg(e.read_reg_e32s(),31&e.read_op8()));break;case 6:192>e.modrm_byte?e.btr_mem(e.modrm_resolve(e.modrm_byte),31&e.read_op8()):e.write_reg_e32(e.btr_reg(e.read_reg_e32s(),31&e.read_op8()));break;case 7:192>e.modrm_byte?e.btc_mem(e.modrm_resolve(e.modrm_byte),31&e.read_op8()):e.write_reg_e32(e.btc_reg(e.read_reg_e32s(),31&e.read_op8()));break;default:dbg_log(e.modrm_byte>>3&7),e.todo()}},t16[187]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.btc_mem(e.modrm_resolve(e.modrm_byte),e.read_g16s()):e.write_reg_e16(e.btc_reg(e.read_reg_e16(),15&e.read_g16s()))},t32[187]=function(e){e.read_modrm_byte(),192>e.modrm_byte?e.btc_mem(e.modrm_resolve(e.modrm_byte),e.read_g32s()):e.write_reg_e32(e.btc_reg(e.read_reg_e32s(),31&e.read_g32s()))},t16[188]=function(e){e.read_modrm_byte();var t=e.read_e16();e.write_g16(e.bsf16(e.read_g16(),t))},t32[188]=function(e){e.read_modrm_byte();var t=e.read_e32s();e.write_g32(e.bsf32(e.read_g32s(),t))},t16[189]=function(e){e.read_modrm_byte();var t=e.read_e16();e.write_g16(e.bsr16(e.read_g16(),t))},t32[189]=function(e){e.read_modrm_byte();var t=e.read_e32s();e.write_g32(e.bsr32(e.read_g32s(),t))},t16[190]=function(e){e.read_modrm_byte();var t=e.read_e8s();e.write_g16(t)},t32[190]=function(e){e.read_modrm_byte();var t=e.read_e8s();e.write_g32(t)},t16[191]=function(e){e.read_modrm_byte(),dbg_assert(!1,"Possibly invalid encoding");var t=e.read_e16();e.write_g16(t)},t32[191]=function(e){e.read_modrm_byte();var t=e.read_e16s();e.write_g32(t)},t[192]=function(e){e.read_modrm_byte();var t=e.read_write_e8();e.write_e8(e.xadd8(t,e.modrm_byte>>1&12|e.modrm_byte>>5&1))},t16[193]=function(e){e.read_modrm_byte();var t=e.read_write_e16();e.write_e16(e.xadd16(t,e.modrm_byte>>2&14))},t32[193]=function(e){e.read_modrm_byte();var t=e.read_write_e32();e.write_e32(e.xadd32(t,e.modrm_byte>>3&7))},t[194]=function(e){e.unimplemented_sse()},t[195]=function(e){e.read_modrm_byte(),192<=e.modrm_byte&&e.trigger_ud(),e.set_e32(e.read_g32s())},t[196]=function(e){e.unimplemented_sse()},t[197]=function(e){e.unimplemented_sse()},t[198]=function(e){e.unimplemented_sse()},t[199]=function(e){switch(e.read_modrm_byte(),e.modrm_byte>>3&7){case 1:192<=e.modrm_byte&&e.trigger_ud();var t=e.modrm_resolve(e.modrm_byte);e.writable_or_pagefault(t,8);var s=e.safe_read32s(t),r=e.safe_read32s(t+4|0);e.reg32s[reg_eax]===s&&e.reg32s[reg_edx]===r?(e.flags|=flag_zero,e.safe_write32(t,e.reg32s[reg_ebx]),e.safe_write32(t+4|0,e.reg32s[reg_ecx])):(e.flags&=~flag_zero,e.reg32s[reg_eax]=s,e.reg32s[reg_edx]=r,e.safe_write32(t,s),e.safe_write32(t+4|0,r)),e.flags_changed&=~flag_zero;break;case 6:s=(t=v86util.has_rand_int())?v86util.get_rand_int():0,e.is_osize_32()?e.set_e32(s):e.set_e16(s),e.flags&=~flags_all,e.flags|=t,e.flags_changed=0;break;default:dbg_log(e.modrm_byte>>3&7,LOG_CPU),e.todo()}},t[200]=function(e){e.bswap(reg_eax)},t[201]=function(e){e.bswap(reg_ecx)},t[202]=function(e){e.bswap(reg_edx)},t[203]=function(e){e.bswap(reg_ebx)},t[204]=function(e){e.bswap(reg_esp)},t[205]=function(e){e.bswap(reg_ebp)},t[206]=function(e){e.bswap(reg_esi)},t[207]=function(e){e.bswap(reg_edi)},t[208]=function(e){e.unimplemented_sse()},t[209]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];t=t[0]>>>0;var i=0,_=0;15>=t&&(i=(65535&s)>>>t|s>>>16>>>t<<16,_=(65535&r)>>>t|r>>>16>>>t<<16),e.write_mmx64s(i,_)},t[210]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];t=t[0]>>>0;var i=0,_=0;31>=t&&(i=s>>>t,_=r>>>t),e.write_mmx64s(i,_)},t[211]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];if(0!==(t=t[0]>>>0)){var i=0,_=0;31>=t?(i=s>>>t|r<<32-t,_=r>>>t):63>=t&&(i=r>>>(31&t),_=0),e.write_mmx64s(i,_)}},t[212]=function(e){e.unimplemented_sse()},t[213]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s();t=new Int16Array(t.buffer);var s=e.read_xmm128s();s=new Int16Array(s.buffer),e.write_xmm128s(t[0]*s[0]&65535|t[1]*s[1]<<16,t[2]*s[2]&65535|t[3]*s[3]<<16,t[4]*s[4]&65535|t[5]*s[5]<<16,t[6]*s[6]&65535|t[7]*s[7]<<16)}else{dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)];var r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];e.write_mmx64s((65535&s)*(65535&t[0])&65535|((s>>>16)*(t[0]>>>16)&65535)<<16,(65535&r)*(65535&t[1])&65535|((r>>>16)*(t[1]>>>16)&65535)<<16)}},t[214]=function(e){dbg_assert((e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_MASK_OPSIZE),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_xmm64s();dbg_assert(192>e.modrm_byte);var s=e.modrm_resolve(e.modrm_byte);e.safe_write64(s,t[0],t[1])},t[215]=function(e){dbg_assert((e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_MASK_OPSIZE),e.task_switch_test_mmx(),e.read_modrm_byte(),192>e.modrm_byte&&e.trigger_ud();var t=e.read_xmm_mem128s();t=new Uint8Array(t.buffer),e.write_g32(t[0]>>7<<0|t[1]>>7<<1|t[2]>>7<<2|t[3]>>7<<3|t[4]>>7<<4|t[5]>>7<<5|t[6]>>7<<6|t[7]>>7<<7|t[8]>>7<<8|t[9]>>7<<9|t[10]>>7<<10|t[11]>>7<<11|t[12]>>7<<12|t[13]>>7<<13|t[14]>>7<<14|t[15]>>7<<15)},t[216]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=new Uint8Array(t.buffer),r=8*(e.modrm_byte>>3&7),i=e.reg_mmx8;t=e.saturate_sd_to_ub(i[r]-s[0]);var _=e.saturate_sd_to_ub(i[r+1]-s[1]),a=e.saturate_sd_to_ub(i[r+2]-s[2]),o=e.saturate_sd_to_ub(i[r+3]-s[3]),n=e.saturate_sd_to_ub(i[r+4]-s[4]),d=e.saturate_sd_to_ub(i[r+5]-s[5]),h=e.saturate_sd_to_ub(i[r+6]-s[6]);s=e.saturate_sd_to_ub(i[r+7]-s[7]),e.write_mmx64s(t|_<<8|a<<16|o<<24,n|d<<8|h<<16|s<<24)},t[217]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1],i=(65535&s)-(65535&t[0]);s=(s>>>16)-(t[0]>>>16),0>i&&(i=0),0>s&&(s=0);var _=(65535&r)-(65535&t[1]);t=(r>>>16)-(t[1]>>>16),0>_&&(_=0),0>t&&(t=0),e.write_mmx64s(i|s<<16,_|t<<16)},t[218]=function(e){dbg_assert((e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_MASK_OPSIZE),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_xmm_mem128s();t=new Uint8Array(t.buffer);var s=e.read_xmm128s();s=new Uint8Array(s.buffer);for(var r=e.create_atom128s(0,0,0,0),i=new Uint8Array(r.buffer),_=0;16>_;_++)i[_]=t[_]<s[_]?t[_]:s[_];e.write_xmm128s(r[0],r[1],r[2],r[3])},t[219]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s();e.write_mmx64s(t[0]&e.reg_mmxs[2*(e.modrm_byte>>3&7)],t[1]&e.reg_mmxs[2*(e.modrm_byte>>3&7)+1])},t[220]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s();t=new Uint8Array(t.buffer);var s=e.read_xmm128s();s=new Uint8Array(s.buffer);for(var r=e.create_atom128s(0,0,0,0),i=new Uint8Array(r.buffer),_=0;16>_;_++)i[_]=e.saturate_ud_to_ub(t[_]+s[_]);e.write_xmm128s(r[0],r[1],r[2],r[3])}else{dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem64s();var a=new Uint8Array(t.buffer),o=8*(e.modrm_byte>>3&7),n=e.reg_mmx8;t=e.saturate_ud_to_ub(n[o]+a[0]),s=e.saturate_ud_to_ub(n[o+1]+a[1]),r=e.saturate_ud_to_ub(n[o+2]+a[2]),i=e.saturate_ud_to_ub(n[o+3]+a[3]),_=e.saturate_ud_to_ub(n[o+4]+a[4]);var d=e.saturate_ud_to_ub(n[o+5]+a[5]),h=e.saturate_ud_to_ub(n[o+6]+a[6]);a=e.saturate_ud_to_ub(n[o+7]+a[7]),e.write_mmx64s(t|s<<8|r<<16|i<<24,_|d<<8|h<<16|a<<24)}},t[221]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s();t=new Uint16Array(t.buffer);var s=e.read_xmm128s();s=new Uint16Array(s.buffer),e.write_xmm128s(e.saturate_uw(t[0]+s[0])|e.saturate_uw(t[1]+s[1])<<16,e.saturate_uw(t[2]+s[2])|e.saturate_uw(t[3]+s[3])<<16,e.saturate_uw(t[4]+s[4])|e.saturate_uw(t[5]+s[5])<<16,e.saturate_uw(t[6]+s[6])|e.saturate_uw(t[7]+s[7])<<16)}else{dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),s=e.read_mmx_mem64s()
;var r=e.reg_mmxs[2*(e.modrm_byte>>3&7)],i=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];t=e.saturate_uw((65535&r)+(65535&s[0])),r=e.saturate_uw((r>>>16)+(s[0]>>>16));var _=e.saturate_uw((65535&i)+(65535&s[1]));s=e.saturate_uw((i>>>16)+(s[1]>>>16)),e.write_mmx64s(t|r<<16,_|s<<16)}},t[222]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s();t=new Uint8Array(t.buffer);var s=e.read_xmm128s();s=new Uint8Array(s.buffer);for(var r=e.create_atom128s(0,0,0,0),i=new Uint8Array(r.buffer),_=0;16>_;_++)i[_]=t[_]>s[_]?t[_]:s[_];e.write_xmm128s(r[0],r[1],r[2],r[3])}else dbg_assert(!1)},t[223]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s();e.write_mmx64s(t[0]&~e.reg_mmxs[2*(e.modrm_byte>>3&7)],t[1]&~e.reg_mmxs[2*(e.modrm_byte>>3&7)+1])},t[224]=function(e){e.unimplemented_sse()},t[225]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];t=t[0]>>>0,15<t&&(t=16),e.write_mmx64s(s<<16>>16>>t&65535|(s>>16>>t&65535)<<16,r<<16>>16>>t&65535|(r>>16>>t&65535)<<16)},t[226]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];t=t[0]>>>0,31<t&&(t=31),e.write_mmx64s(s>>t,r>>t)},t[227]=function(e){e.unimplemented_sse()},t[228]=function(e){dbg_assert((e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_xmm_mem128s();t=new Uint16Array(t.buffer);var s=e.read_xmm128s();s=new Uint16Array(s.buffer),e.write_xmm128s(t[0]*s[0]>>>16|t[1]*s[1]&4294901760,t[2]*s[2]>>>16|t[3]*s[3]&4294901760,t[4]*s[4]>>>16|t[5]*s[5]&4294901760,t[6]*s[6]>>>16|t[7]*s[7]&4294901760)},t[229]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];e.write_mmx64s((s<<16>>16)*(t[0]<<16>>16)>>>16|(s>>16)*(t[0]>>16)>>>16<<16,(r<<16>>16)*(t[1]<<16>>16)>>>16|(r>>16)*(t[1]>>16)>>>16<<16)},t[230]=function(e){e.unimplemented_sse()},t[231]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),192<=e.modrm_byte&&e.trigger_ud(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm128s(),s=e.modrm_resolve(e.modrm_byte);e.safe_write128(s,t[0],t[1],t[2],t[3])}else dbg_assert(!1)},t[232]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=new Int8Array(t.buffer),r=8*(e.modrm_byte>>3&7),i=e.reg_mmx8s;t=e.saturate_sd_to_sb(i[r]-s[0]);var _=e.saturate_sd_to_sb(i[r+1]-s[1]),a=e.saturate_sd_to_sb(i[r+2]-s[2]),o=e.saturate_sd_to_sb(i[r+3]-s[3]),n=e.saturate_sd_to_sb(i[r+4]-s[4]),d=e.saturate_sd_to_sb(i[r+5]-s[5]),h=e.saturate_sd_to_sb(i[r+6]-s[6]);s=e.saturate_sd_to_sb(i[r+7]-s[7]),e.write_mmx64s(t|_<<8|a<<16|o<<24,n|d<<8|h<<16|s<<24)},t[233]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1],i=e.saturate_sd_to_sw((s<<16>>16)-(t[0]<<16>>16));s=e.saturate_sd_to_sw((s>>16)-(t[0]>>16));var _=e.saturate_sd_to_sw((r<<16>>16)-(t[1]<<16>>16));t=e.saturate_sd_to_sw((r>>16)-(t[1]>>16)),e.write_mmx64s(i|s<<16,_|t<<16)},t[234]=function(e){e.unimplemented_sse()},t[235]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))===PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s(),s=e.read_xmm128s();e.write_xmm128s(t[0]|s[0],t[1]|s[1],t[2]|s[2],t[3]|s[3])}else dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem64s(),e.write_mmx64s(t[0]|e.reg_mmxs[2*(e.modrm_byte>>3&7)],t[1]|e.reg_mmxs[2*(e.modrm_byte>>3&7)+1])},t[236]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=new Int8Array(t.buffer),r=8*(e.modrm_byte>>3&7),i=e.reg_mmx8s;t=e.saturate_sd_to_sb(i[r]+s[0]);var _=e.saturate_sd_to_sb(i[r+1]+s[1]),a=e.saturate_sd_to_sb(i[r+2]+s[2]),o=e.saturate_sd_to_sb(i[r+3]+s[3]),n=e.saturate_sd_to_sb(i[r+4]+s[4]),d=e.saturate_sd_to_sb(i[r+5]+s[5]),h=e.saturate_sd_to_sb(i[r+6]+s[6]);s=e.saturate_sd_to_sb(i[r+7]+s[7]),e.write_mmx64s(t|_<<8|a<<16|o<<24,n|d<<8|h<<16|s<<24)},t[237]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1],i=e.saturate_sd_to_sw((s<<16>>16)+(t[0]<<16>>16));s=e.saturate_sd_to_sw((s>>16)+(t[0]>>16));var _=e.saturate_sd_to_sw((r<<16>>16)+(t[1]<<16>>16));t=e.saturate_sd_to_sw((r>>16)+(t[1]>>16)),e.write_mmx64s(i|s<<16,_|t<<16)},t[238]=function(e){e.unimplemented_sse()},t[239]=function(e){if(e.task_switch_test_mmx(),e.read_modrm_byte(),(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))==PREFIX_MASK_OPSIZE){var t=e.read_xmm_mem128s(),s=e.read_xmm128s();e.write_xmm128s(t[0]^s[0],t[1]^s[1],t[2]^s[2],t[3]^s[3])}else dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),t=e.read_mmx_mem64s(),e.write_mmx64s(t[0]^e.reg_mmxs[2*(e.modrm_byte>>3&7)],t[1]^e.reg_mmxs[2*(e.modrm_byte>>3&7)+1])},t[240]=function(e){e.unimplemented_sse()},t[241]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];t=t[0]>>>0;var i=0,_=0;15>=t&&(i=(65535&s)<<t&65535|s>>>16<<t<<16,_=(65535&r)<<t&65535|r>>>16<<t<<16),e.write_mmx64s(i,_)},t[242]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];t=t[0]>>>0;var i=0,_=0;31>=t&&(i=s<<t,_=r<<t),e.write_mmx64s(i,_)},t[243]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];if(0!==(t=t[0]>>>0)){var i=0,_=0;31>=t?(i=s<<t,_=r<<t|s>>>32-t):63>=t&&(_=s<<(31&t),i=0),e.write_mmx64s(i,_)}},t[244]=function(e){e.unimplemented_sse()},t[245]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];e.write_mmx64s((s<<16>>16)*(t[0]<<16>>16)+(s>>16)*(t[0]>>16)|0,(r<<16>>16)*(t[1]<<16>>16)+(r>>16)*(t[1]>>16)|0)},t[246]=function(e){e.unimplemented_sse()},t[247]=function(e){e.unimplemented_sse()},t[248]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s();t=new Int8Array(t.buffer);var s=8*(e.modrm_byte>>3&7),r=e.reg_mmx8s;e.write_mmx64s(r[s]-t[0]&255|(r[s+1]-t[1]&255)<<8|(r[s+2]-t[2]&255)<<16|(r[s+3]-t[3]&255)<<24,r[s+4]-t[4]&255|(r[s+5]-t[5]&255)<<8|(r[s+6]-t[6]&255)<<16|(r[s+7]-t[7]&255)<<24)},t[249]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];e.write_mmx64s(s-t[0]&65535|((s>>>16)-(t[0]>>>16)&65535)<<16,r-t[1]&65535|((r>>>16)-(t[1]>>>16)&65535)<<16)},t[250]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s();e.write_mmx64s(e.reg_mmxs[2*(e.modrm_byte>>3&7)]-t[0],e.reg_mmxs[2*(e.modrm_byte>>3&7)+1]-t[1])},t[251]=function(e){e.unimplemented_sse()},t[252]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s();t=new Int8Array(t.buffer);var s=8*(e.modrm_byte>>3&7),r=e.reg_mmx8s;e.write_mmx64s(r[s]+t[0]&255|(r[s+1]+t[1]&255)<<8|(r[s+2]+t[2]&255)<<16|(r[s+3]+t[3]&255)<<24,r[s+4]+t[4]&255|(r[s+5]+t[5]&255)<<8|(r[s+6]+t[6]&255)<<16|(r[s+7]+t[7]&255)<<24)},t[253]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s(),s=e.reg_mmxs[2*(e.modrm_byte>>3&7)],r=e.reg_mmxs[2*(e.modrm_byte>>3&7)+1];e.write_mmx64s(s+t[0]&65535|((s>>>16)+(t[0]>>>16)&65535)<<16,r+t[1]&65535|((r>>>16)+(t[1]>>>16)&65535)<<16)},t[254]=function(e){dbg_assert(0==(e.prefixes&(PREFIX_MASK_REP|PREFIX_MASK_OPSIZE))),e.task_switch_test_mmx(),e.read_modrm_byte();var t=e.read_mmx_mem64s();e.write_mmx64s(e.reg_mmxs[2*(e.modrm_byte>>3&7)]+t[0]|0,e.reg_mmxs[2*(e.modrm_byte>>3&7)+1]+t[1]|0)},t[255]=function(e){dbg_log("#ud: 0F FF"),e.trigger_ud()};var table0F_16=[],table0F_32=[];for(CPU.prototype.table0F_16=table0F_16,CPU.prototype.table0F_32=table0F_32,i=0;256>i;i++)t[i]?table0F_16[i]=table0F_32[i]=t[i]:t16[i]&&(table0F_16[i]=t16[i],table0F_32[i]=t32[i]);CPU.prototype.debug_init=function(){function e(){DEBUG&&(o.running||o.cycle(),r(),Date.now(),o.running=!1,_())}function t(e){var t=o.flags&flag_vm?1:0;t=o.protected_mode?t?"vm86":"prot":"real";var s=o.get_eflags(),r=o.getiopl(),i=o.cpl,_=h(o.sreg[reg_cs],4)+":"+h(o.get_real_eip()>>>0,8),a=h(o.sreg[reg_ss],4)+":"+h(o.get_stack_reg()>>>0,8),n=o.is_32?"32":"16",d=o.flags&flag_interrupt?1:0,g={};g[flag_carry]="c",g[flag_parity]="p",g[flag_adjust]="a",g[flag_zero]="z",g[flag_sign]="s",g[flag_trap]="t",g[flag_interrupt]="i",g[flag_direction]="d",g[flag_overflow]="o",g=g;for(var c="",p=0;16>p;p++)g[1<<p]&&(c=s&1<<p?c+g[1<<p]:c+" ");return"mode="+t+"/"+n+" paging="+ +o.paging+" iopl="+r+" cpl="+i+" if="+d+" cs:eip="+_+" cs_off="+h(o.get_seg(reg_cs)>>>0,8)+" flgs="+h(o.get_eflags()>>>0,6)+" ("+c+") ss:esp="+a+" ssize="+ +o.stack_size_32+(e?" in "+e:"")}function s(){for(var e={eax:reg_eax,ecx:reg_ecx,edx:reg_edx,ebx:reg_ebx,esp:reg_esp,ebp:reg_ebp,esi:reg_esi,edi:reg_edi},t="eax ecx edx ebx esp ebp esi edi".split(" "),s="",r="",i=0;4>i;i++)s+=t[i]+"="+h(o.reg32[e[t[i]]],8)+" ",r+=t[i+4]+"="+h(o.reg32[e[t[i+4]]],8)+" ";return s+=" ds="+h(o.sreg[reg_ds],4)+" es="+h(o.sreg[reg_es],4)+" fs="+h(o.sreg[reg_fs],4),r+=" gs="+h(o.sreg[reg_gs],4)+" cs="+h(o.sreg[reg_cs],4)+" ss="+h(o.sreg[reg_ss],4),[s,r]}function r(){if(DEBUG){var e=s();dbg_log(e[0],LOG_CPU),dbg_log(e[1],LOG_CPU)}}function i(){if(DEBUG){n.step_mode=!0;var e,t="";if(n.trace_all&&n.all_ops?e=n.all_ops:n.ops&&(e=n.ops.toArray()),!e)return"";for(var s=0;s<e.length;s+=2){var r=e[s+1];t+=h(e[s],8)+": "+v86util.pads(d[r]||"unkown",20)+h(r,2)+"\n"}return n.ops.clear(),n.all_ops=[],t}}function _(){DEBUG&&n.show(i())}function a(e,t){if(DEBUG){if(!(1&e))return!1;var s=128==(128&e);return{size:s,global:256==(256&e),accessed:32==(32&e),dirty:64==(64&e),cache_disable:16==(16&e),user:4==(4&e),read_write:2==(2&e),address:(s&&!t?4290772992&e:4294963200&e)>>>0}}}var o=this,n={};this.debug=n,n.step_mode=!1,n.ops=void 0,n.all_ops=[],n.trace_all=!1,n.show=function(e){if("undefined"!=typeof document){var t=document.getElementById("log");if(t)return t.textContent+=e+"\n",t.style.display="block",void(t.scrollTop=1e9)}console.log(e)},n.init=function(){function e(e){10===e?(dbg_log(t,LOG_BIOS),t=""):t+=String.fromCharCode(e)}if(DEBUG&&(n.ops=new CircularQueue(2e5),o.io)){var t="";o.io.register_write(1026,this,e),o.io.register_write(1280,this,e)}},n.get_regs_short=s,n.dump_regs=r,n.dump_instructions=_,n.get_instructions=i,n.get_state=t,n.dump_state=function(e){DEBUG&&dbg_log(t(e),LOG_CPU)},n.dump_stack=function(e,t){if(DEBUG){var s=o.reg32[reg_esp];for(dbg_log("========= STACK =========="),(t>=e||void 0===t)&&(e=5,t=-5);e>t;e--){var r=" ";e||(r="=> "),r+=h(e,2)+" | ",dbg_log(r+h(s+4*e,8)+" | "+h(o.read32s(s+4*e)>>>0))}}},n.dump_page_directory=function(){if(DEBUG)for(var e=0;1024>e;e++){var t=o.read32s(o.cr[3]+4*e),s=a(t,!0);if(s)if(t="",t+=s.size?"S ":" ",t+=s.accessed?"A ":" ",t+=s.cache_disable?"Cd ":" ",t+=s.user?"U ":" ",t+=s.read_write?"Rw ":" ",s.size)dbg_log("=== "+h(e<<22>>>0,8)+" -> "+h(s.address>>>0,8)+" | "+t);else{dbg_log("=== "+h(e<<22>>>0,8)+" | "+t);for(var r=0;1024>r;r++){var i=s.address+4*r;t=o.read32s(i);var _=a(t,!1);_&&(t="",t+=_.cache_disable?"Cd ":" ",t+=_.user?"U ":" ",t+=_.read_write?"Rw ":" ",t+=_.global?"G ":" ",t+=_.accessed?"A ":" ",t+=_.dirty?"Di ":" ",dbg_log("# "+h((e<<22|r<<12)>>>0,8)+" -> "+h(_.address,8)+" | "+t+" (at "+h(i,8)+")"))}}}},n.dump_gdt_ldt=function(){function e(e,t){for(var s=0;s<t;s+=8,e+=8){var r=o.read16(e+2)|o.read8(e+4)<<16|o.read8(e+7)<<24,i=o.read16(e)|(15&o.read8(e+6))<<16,_=o.read8(e+5),a=o.read8(e+6)>>4,n="",d=_>>5&3;n=128&_?n+" P ":n+"NP ",16&_?(n=4&a?n+"32b ":n+"16b ",8&_?(n+="X ",4&_&&(n+="C ")):n+="R ",n+="RW "):n+="sys: "+h(15&_),8&a&&(i=i<<12|4095),dbg_log(h(-8&s,4)+" "+h(r>>>0,8)+" ("+h(i>>>0,8)+" bytes) "+n+"; dpl = "+d+", a = "+_.toString(2)+", f = "+a.toString(2))}}DEBUG&&(dbg_log("gdt: (len = "+h(o.gdtr_size)+")"),e(o.translate_address_system_read(o.gdtr_offset),o.gdtr_size),dbg_log("\nldt: (len = "+h(o.segment_limits[reg_ldtr])+")"),e(o.translate_address_system_read(o.segment_offsets[reg_ldtr]),o.segment_limits[reg_ldtr]))},n.dump_idt=function(){if(DEBUG)for(var e=0;e<o.idtr_size;e+=8){var t=o.translate_address_system_read(o.idtr_offset+e),s=o.read16(t)|o.read16(t+6)<<16,r=o.read16(t+2);t=o.read8(t+5);var i=t>>5&3,_=5==(31&t)?"task gate ":14==(31&t)?"intr gate ":15==(31&t)?"trap gate ":"invalid ";_=128&t?_+" P":_+"NP",dbg_log(h(e>>3,4)+" "+h(s>>>0,8)+", "+h(r,4)+"; "+_+"; dpl = "+i+", t = "+t.toString(2))}},n.get_memory_dump=function(e,t){if(DEBUG)return void 0===e?(e=0,t=o.memory_size):void 0===t&&(t=e,e=0),o.mem8.slice(e,e+t).buffer},n.memory_hex_dump=function(e,t){if(DEBUG){t=t||64;for(var s,r,i=0;i<t>>4;i++){s=h(e+(i<<4),5)+" ";for(var _=0;16>_;_++)r=o.read8(e+(i<<4)+_),s+=h(r,2)+" ";for(s+=" ",_=0;16>_;_++)r=o.read8(e+(i<<4)+_),s+=33>r||126<r?".":String.fromCharCode(r);dbg_log(s)}}},n.used_memory_dump=function(){if(DEBUG)for(var e=o.memory_size/128/16|0,t,s=0;16>s;s++){t=h(128*s*e,8)+" | ";for(var r=0;128>r;r++)t+=0<o.mem32s[(128*s+r)*e]?"X":" ";dbg_log(t)}},n.step=e,n.run_until=function(){if(DEBUG){o.running=!1;var t=parseInt(prompt("input hex",""),16);if(t)for(;o.instruction_pointer!=t;)e()}},n.unimpl=function(e){return e="Unimplemented"+(e?": "+e:""),n.show(e),DEBUG?console.trace():n.show("Execution stopped"),e};var d="ADD ADD ADD ADD ADD ADD PUSH POP OR OR OR OR OR OR PUSH 0F: ADC ADC ADC ADC ADC ADC PUSH POP SBB SBB SBB SBB SBB SBB PUSH POP AND AND AND AND AND AND ES DAA SUB SUB SUB SUB SUB SUB CS DAS XOR XOR XOR XOR XOR XOR SS AAA CMP CMP CMP CMP CMP CMP DS AAS INC INC INC INC INC INC INC INC DEC DEC DEC DEC DEC DEC DEC DEC PUSH PUSH PUSH PUSH PUSH PUSH PUSH PUSH POP POP POP POP POP POP POP POP PUSHA POPA BOUND ARPL FS GS none none PUSH IMUL PUSH IMUL INS INS OUTS OUTS JO JNO JB JNB JZ JNZ JBE JNBE JS JNS JP JNP JL JNL JLE JNLE ADD ADD ADD ADD TEST TEST XCHG XCHG MOV MOV MOV MOV MOV LEA MOV POP NOP XCHG XCHG XCHG XCHG XCHG XCHG XCHG CBW CWD CALLF FWAIT PUSHF POPF SAHF LAHF MOV MOV MOV MOV MOVS MOVS CMPS CMPS TEST TEST STOS STOS LODS LODS SCAS SCAS MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV ROL ROL RETN RETN LES LDS MOV MOV ENTER LEAVE RETF RETF INT INT INTO IRET ROL ROL ROL ROL AAM AAD none XLAT FADD FLD FIADD FILD FADD FLD FIADD FILD LOOPNZ LOOPZ LOOP JCXZ IN IN OUT OUT CALL JMP JMPF JMP IN IN OUT OUT LOCK none REPNZ REPZ HLT CMC TEST TEST CLC STC CLI STI CLD STD INC INC".split(" ");n.logop=function(e,t){DEBUG&&n.step_mode&&(n.trace_all&&n.all_ops?n.all_ops.push(e,t):n.ops&&(n.ops.add(e),n.ops.add(t)))},n.debug_interrupt=function(e){}};var ELF_MAGIC=1179403647,types=DataView.prototype,U8={size:1,get:types.getUint8,set:types.setUint8},U16={size:2,get:types.getUint16,set:types.setUint16},U32={size:4,get:types.getUint32,set:types.setUint32},pad=function(e){return{size:e,get:function(e){return-1}}},Header=create_struct([{magic:U32},{class:U8},{data:U8},{version0:U8},{osabi:U8},{abiversion:U8},{pad0:pad(7)},{type:U16},{machine:U16},{version1:U32},{entry:U32},{phoff:U32},{shoff:U32},{flags:U32},{ehsize:U16},{phentsize:U16},{phnum:U16},{shentsize:U16},{shnum:U16},{shstrndx:U16}]);console.assert(52===Header.reduce(function(e,t){return e+t.size},0));var ProgramHeader=create_struct([{type:U32},{offset:U32},{vaddr:U32},{paddr:U32},{filesz:U32},{memsz:U32},{flags:U32},{align:U32}]);console.assert(32===ProgramHeader.reduce(function(e,t){return e+t.size},0));var SectionHeader=create_struct([{name:U32},{type:U32},{flags:U32},{addr:U32},{offset:U32},{size:U32},{link:U32},{info:U32},{addralign:U32},{entsize:U32}]);console.assert(40===SectionHeader.reduce(function(e,t){return e+t.size},0));var SHIFT_SCAN_CODE=42,SCAN_CODE_RELEASE=128;SpeakerAdapter.prototype.beep_update=function(){var e=this.audio_context.currentTime;this.pit_enabled&&this.beep_enable?(this.beep_oscillator.frequency.setValueAtTime(this.beep_frequency,e),this.beep_playing||(this.beep_gain.gain.setValueAtTime(1,e),this.beep_playing=!0)):this.beep_playing&&(this.beep_gain.gain.setValueAtTime(0,e),this.beep_playing=!1)},SpeakerAdapter.prototype.dac_process=function(e){if(this.dac_enabled){var t=e.outputBuffer;t.copyToChannel(this.dac_buffer0,0),t.copyToChannel(this.dac_buffer1,1),this.bus.send("speaker-request-data",t.length),DEBUG&&this.debug_dac&&this.debug_dac_out.push(e.outputBuffer.getChannelData(0).slice())}},NetworkAdapter.prototype.handle_message=function(e){this.bus&&this.bus.send("net0-receive",new Uint8Array(e.data))},NetworkAdapter.prototype.handle_close=function(e){this.connect(),setTimeout(this.connect.bind(this),this.reconnect_interval)},NetworkAdapter.prototype.handle_open=function(e){for(e=0;e<this.send_queue.length;e++)this.send(this.send_queue[e]);this.send_queue=[]},NetworkAdapter.prototype.handle_error=function(e){},NetworkAdapter.prototype.destroy=function(){this.socket&&this.socket.close()},NetworkAdapter.prototype.connect=function(){if(this.socket){var e=this.socket.readyState;if(0===e||1===e)return}if(e=Date.now(),!(this.last_connect_attempt+this.reconnect_interval>e)){this.last_connect_attempt=Date.now();try{this.socket=new WebSocket(this.url)}catch(e){return void this.handle_close(void 0)}this.socket.binaryType="arraybuffer",this.socket.onopen=this.handle_open.bind(this),this.socket.onmessage=this.handle_message.bind(this),this.socket.onclose=this.handle_close.bind(this),this.socket.onerror=this.handle_error.bind(this)}},NetworkAdapter.prototype.send=function(e){this.socket&&1===this.socket.readyState?this.socket.send(e):(this.send_queue.push(e),this.send_queue.length>2*this.send_queue_limit&&(this.send_queue=this.send_queue.slice(-this.send_queue_limit)),this.connect())},function(){function e(e,t){var s=new XMLHttpRequest;if(s.open(t.method||"get",e,!0),t.as_text||(s.responseType="arraybuffer"),t.headers)for(var r=Object.keys(t.headers),i=0;i<r.length;i++){var _=r[i];s.setRequestHeader(_,t.headers[_])}t.range&&(r=t.range.start,s.setRequestHeader("Range","bytes="+r+"-"+(r+t.range.length-1))),s.onload=function(r){4===s.readyState&&(200!==s.status&&206!==s.status?console.error("Loading the image `"+e+"` failed (status %d)",s.status):s.response&&t.done&&t.done(s.response,s))},t.progress&&(s.onprogress=function(e){t.progress(e)}),s.send(null)}function t(e,t){var s=require("fs");t.range?(dbg_assert(!t.as_text),s.open(e,"r",function(e,r){if(e)throw e;var i=t.range.length,_=new global.Buffer(i);s.read(r,_,0,i,t.range.start,function(e,a){if(e)throw e;dbg_assert(a===i),t.done&&t.done(new Uint8Array(_)),s.close(r,function(e){if(e)throw e})})})):s.readFile(e,{encoding:t.as_text?"utf-8":null},function(s,r){s?console.log("Could not read file:",e,s):(s=r,t.as_text||(s=new Uint8Array(s).buffer),t.done(s))})}function s(e,t){this.filename=e,this.block_size=256,this.byteLength=t,this.loaded_blocks={},this.onprogress=this.onload=void 0}function r(e){this.file=e,this.byteLength=e.size,1073741824<e.size&&console.warn("SyncFileBuffer: Allocating buffer of "+(e.size>>20)+" MB ..."),this.buffer=new ArrayBuffer(e.size),this.onprogress=this.onload=void 0}function i(e){this.file=e,this.byteLength=e.size,this.block_size=256,this.loaded_blocks={},this.onprogress=this.onload=void 0}v86util.load_file="undefined"==typeof XMLHttpRequest?t:e,v86util.AsyncXHRBuffer=s,v86util.AsyncFileBuffer=i,v86util.SyncFileBuffer=r;var _="undefined"==typeof XMLHttpRequest?function(e,t){require("fs").stat(e,function(e,s){e?t(e):t(null,s.size)})}:function(e,t){v86util.load_file(e,{done:function(e,s){e=s.getResponseHeader("Content-Range")||"",(s=e.match(/\/(\d+)\s*$/))?t(null,+s[1]):t({header:e})},headers:{Range:"bytes=0-0"}})};s.prototype.load=function(){var e=this;void 0!==this.byteLength?this.onload&&this.onload({}):_(this.filename,function(t,s){t?console.assert(!1,"Cannot use: "+e.filename+". `Range: bytes=...` header not supported (Got `"+t.header+"`)"):(dbg_assert(0<=s),e.byteLength=s,e.onload&&e.onload({}))})},s.prototype.get_from_cache=function(e,t,s){s=t/this.block_size,e/=this.block_size;for(var r=0;r<s;r++)if(!this.loaded_blocks[e+r])return;if(1===s)return this.loaded_blocks[e];for(t=new Uint8Array(t),r=0;r<s;r++)t.set(this.loaded_blocks[e+r],r*this.block_size);return t},s.prototype.get=function(e,t,s){console.assert(e+t<=this.byteLength),console.assert(0==e%this.block_size),console.assert(0==t%this.block_size),console.assert(t);var r=this.get_from_cache(e,t,s);r?s(r):v86util.load_file(this.filename,{done:function(r){r=new Uint8Array(r),this.handle_read(e,t,r),s(r)}.bind(this),range:{start:e,length:t}})},s.prototype.set=function(e,t,s){console.assert(e+t.byteLength<=this.byteLength);var r=t.length;console.assert(0==e%this.block_size),console.assert(0==r%this.block_size),console.assert(r),e/=this.block_size,r/=this.block_size;for(var i=0;i<r;i++){var _=this.loaded_blocks[e+i];void 0===_&&(_=this.loaded_blocks[e+i]=new Uint8Array(this.block_size));var a=t.subarray(i*this.block_size,(i+1)*this.block_size);_.set(a),console.assert(_.byteLength===a.length)}s()},s.prototype.handle_read=function(e,t,s){e/=this.block_size,t/=this.block_size;for(var r=0;r<t;r++){var i=this.loaded_blocks[e+r];i&&s.set(i,r*this.block_size)}},s.prototype.get_buffer=function(e){e()},s.prototype.get_written_blocks=function(){var e=0;for(t in this.loaded_blocks)e++;e=new Uint8Array(e*this.block_size);var t=[],s=0;for(i in this.loaded_blocks){var r=this.loaded_blocks[i];dbg_assert(r.length===this.block_size);var i=+i;t.push(i),e.set(r,s*this.block_size),s++}return{buffer:e,indices:t,block_size:this.block_size}},r.prototype.load=function(){this.load_next(0)},r.prototype.load_next=function(e){var t=new FileReader;if(t.onload=function(t){t=new Uint8Array(t.target.result),new Uint8Array(this.buffer,e).set(t),this.load_next(e+4194304)}.bind(this),this.onprogress&&this.onprogress({loaded:e,total:this.byteLength,lengthComputable:!0}),e<this.byteLength){var s=this.file.slice(e,Math.min(e+4194304,this.byteLength));t.readAsArrayBuffer(s)}else this.file=void 0,this.onload&&this.onload({buffer:this.buffer})},r.prototype.get=function(e,t,s){console.assert(e+t<=this.byteLength),s(new Uint8Array(this.buffer,e,t))},r.prototype.set=function(e,t,s){console.assert(e+t.byteLength<=this.byteLength),new Uint8Array(this.buffer,e,t.byteLength).set(t),s()},r.prototype.get_buffer=function(e){e(this.buffer)},i.prototype.load=function(){this.onload&&this.onload({})},i.prototype.get=function(e,t,s){console.assert(0==e%this.block_size),console.assert(0==t%this.block_size),console.assert(t);var r=this.get_from_cache(e,t,s);r?s(r):(r=new FileReader,r.onload=function(r){r=new Uint8Array(r.target.result),this.handle_read(e,t,r),s(r)}.bind(this),r.readAsArrayBuffer(this.file.slice(e,e+t)))},i.prototype.get_from_cache=s.prototype.get_from_cache,i.prototype.set=s.prototype.set,i.prototype.handle_read=s.prototype.handle_read,i.prototype.get_buffer=function(e){e()},i.prototype.get_as_file=function(e){for(var t=[],s=Object.keys(this.loaded_blocks).map(Number).sort(function(e,t){return e-t}),r=0,i=0;i<s.length;i++){var _=s[i],a=this.loaded_blocks[_];_*=this.block_size,console.assert(_>=r),_!==r&&(t.push(this.file.slice(r,_)),r=_),t.push(a),r+=a.length}return r!==this.file.size&&t.push(this.file.slice(r)),e=new File(t,e),console.assert(e.size===this.file.size),e}}(),V86Starter.prototype.run=function(){this.bus.send("cpu-run")},goog.exportProperty(V86Starter.prototype,"run",V86Starter.prototype.run),V86Starter.prototype.stop=function(){this.bus.send("cpu-stop")},goog.exportProperty(V86Starter.prototype,"stop",V86Starter.prototype.stop),V86Starter.prototype.destroy=function(){this.keyboard_adapter.destroy()},goog.exportProperty(V86Starter.prototype,"destroy",V86Starter.prototype.destroy),V86Starter.prototype.restart=function(){this.bus.send("cpu-restart")},goog.exportProperty(V86Starter.prototype,"restart",V86Starter.prototype.restart),V86Starter.prototype.add_listener=function(e,t){this.bus.register(e,t,this)},goog.exportProperty(V86Starter.prototype,"add_listener",V86Starter.prototype.add_listener),V86Starter.prototype.remove_listener=function(e,t){this.bus.unregister(e,t)},goog.exportProperty(V86Starter.prototype,"remove_listener",V86Starter.prototype.remove_listener),V86Starter.prototype.restore_state=function(e){this.v86.restore_state(e)},goog.exportProperty(V86Starter.prototype,"restore_state",V86Starter.prototype.restore_state),V86Starter.prototype.save_state=function(e){setTimeout(function(){try{e(null,this.v86.save_state())}catch(t){e(t,null)}}.bind(this),0)},goog.exportProperty(V86Starter.prototype,"save_state",V86Starter.prototype.save_state),V86Starter.prototype.get_statistics=function(){console.warn("V86Starter.prototype.get_statistics is deprecated. Use events instead.");var e={cpu:{instruction_counter:this.get_instruction_counter()}};if(!this.v86)return e;var t=this.v86.cpu.devices;return t.hda&&(e.hda=t.hda.stats),t.cdrom&&(e.cdrom=t.cdrom.stats),t.ps2&&(e.mouse={enabled:t.ps2.use_mouse}),t.vga&&(e.vga={is_graphical:t.vga.stats.is_graphical}),e},goog.exportProperty(V86Starter.prototype,"get_statistics",V86Starter.prototype.get_statistics),V86Starter.prototype.get_instruction_counter=function(){return this.v86?this.v86.cpu.timestamp_counter:0},goog.exportProperty(V86Starter.prototype,"get_instruction_counter",V86Starter.prototype.get_instruction_counter),V86Starter.prototype.is_running=function(){return this.cpu_is_running},goog.exportProperty(V86Starter.prototype,"is_running",V86Starter.prototype.is_running),V86Starter.prototype.keyboard_send_scancodes=function(e){for(var t=0;t<e.length;t++)this.bus.send("keyboard-code",e[t])},goog.exportProperty(V86Starter.prototype,"keyboard_send_scancodes",V86Starter.prototype.keyboard_send_scancodes),V86Starter.prototype.keyboard_send_keys=function(e){for(var t=0;t<e.length;t++)this.keyboard_adapter.simulate_press(e[t])},goog.exportProperty(V86Starter.prototype,"keyboard_send_keys",V86Starter.prototype.keyboard_send_keys),V86Starter.prototype.keyboard_send_text=function(e){for(var t=0;t<e.length;t++)this.keyboard_adapter.simulate_char(e[t])},goog.exportProperty(V86Starter.prototype,"keyboard_send_text",V86Starter.prototype.keyboard_send_text),V86Starter.prototype.screen_make_screenshot=function(){this.screen_adapter&&this.screen_adapter.make_screenshot()},goog.exportProperty(V86Starter.prototype,"screen_make_screenshot",V86Starter.prototype.screen_make_screenshot),V86Starter.prototype.screen_set_scale=function(e,t){this.screen_adapter&&this.screen_adapter.set_scale(e,t)},goog.exportProperty(V86Starter.prototype,"screen_set_scale",V86Starter.prototype.screen_set_scale),V86Starter.prototype.screen_go_fullscreen=function(){if(this.screen_adapter){var e=document.getElementById("screen_container");if(e){var t=e.requestFullScreen||e.webkitRequestFullscreen||e.mozRequestFullScreen||e.msRequestFullScreen;t&&(t.call(e),(e=document.getElementsByClassName("phone_keyboard")[0])&&e.focus()),this.lock_mouse()}}},goog.exportProperty(V86Starter.prototype,"screen_go_fullscreen",V86Starter.prototype.screen_go_fullscreen),V86Starter.prototype.lock_mouse=function(){var e=document.body,t=e.requestPointerLock||e.mozRequestPointerLock||e.webkitRequestPointerLock;t&&t.call(e)},goog.exportProperty(V86Starter.prototype,"lock_mouse",V86Starter.prototype.lock_mouse),V86Starter.prototype.mouse_set_status=function(e){this.mouse_adapter&&(this.mouse_adapter.emu_enabled=e)},V86Starter.prototype.keyboard_set_status=function(e){this.keyboard_adapter&&(this.keyboard_adapter.emu_enabled=e)},goog.exportProperty(V86Starter.prototype,"keyboard_set_status",V86Starter.prototype.keyboard_set_status),V86Starter.prototype.serial0_send=function(e){for(var t=0;t<e.length;t++)this.bus.send("serial0-input",e.charCodeAt(t))},goog.exportProperty(V86Starter.prototype,"serial0_send",V86Starter.prototype.serial0_send),V86Starter.prototype.create_file=function(e,t,s){var r=this.fs9p;if(r){var i=e.split("/");i=i[i.length-1],e=r.SearchPath(e).parentid;var _=""===i||-1===e;_||r.CreateBinaryFile(i,e,t),s&&setTimeout(function(){s(_?new FileNotFoundError:null)},0)}},goog.exportProperty(V86Starter.prototype,"create_file",V86Starter.prototype.create_file),V86Starter.prototype.read_file=function(e,t){var s=this.fs9p;if(s){var r=s.SearchPath(e).id;-1===r?t(new FileNotFoundError,null):(s.OpenInode(r,void 0),s.AddEvent(r,function(){var e=s.inodedata[r];e?t(null,e.subarray(0,s.inodes[r].size)):t(new FileNotFoundError,null)}))}},goog.exportProperty(V86Starter.prototype,"read_file",V86Starter.prototype.read_file),FileNotFoundError.prototype=Error.prototype,"undefined"!=typeof window?(window.V86Starter=V86Starter,window.V86=V86Starter):"undefined"!=typeof module&&void 0!==module.exports?(module.exports.V86Starter=V86Starter,module.exports.V86=V86Starter):"function"==typeof importScripts&&(self.V86Starter=V86Starter,self.V86=V86Starter);var WorkerBus={Connector:function(e){this.listeners={},this.pair=e,e.addEventListener("message",function(e){e=e.data;for(var t=this.listeners[e[0]],s=0;s<t.length;s++){var r=t[s];r.fn.call(r.this_value,e[1])}}.bind(this),!1)}};WorkerBus.Connector.prototype.register=function(e,t,s){var r=this.listeners[e];void 0===r&&(r=this.listeners[e]=[]),r.push({fn:t,this_value:s})},WorkerBus.Connector.prototype.send=function(e,t,s){dbg_assert(1<=arguments.length),this.pair&&this.pair.postMessage([e,t],s)},WorkerBus.init=function(e){return new WorkerBus.Connector(e)};var S_IRWXUGO=511,S_IFMT=61440,S_IFSOCK=49152,S_IFLNK=40960,S_IFREG=32768,S_IFBLK=24576,S_IFDIR=16384,S_IFCHR=8192,O_RDONLY=0,O_WRONLY=1,O_RDWR=2,O_ACCMODE=3,STATUS_INVALID=-1,STATUS_OK=0,STATUS_OPEN=1,STATUS_ON_SERVER=2,STATUS_UNLINKED=4,JSONFS_IDX_TARGET=6;FS.prototype.AddEvent=function(e,t){this.GetInode(e).status==STATUS_OK?t():this.events.push({id:e,OnEvent:t})},FS.prototype.HandleEvent=function(e){0==this.filesinloadingqueue&&(this.OnLoaded(),this.OnLoaded=function(){});for(var t=[],s=0;s<this.events.length;s++)this.events[s].id==e?this.events[s].OnEvent():t.push(this.events[s]);this.events=t},FS.prototype.OnJSONLoaded=function(e){if(DEBUG&&console.assert(e,"Invalid fs passed to OnJSONLoaded"),e=JSON.parse(e),2!==e.version)throw"The filesystem JSON format has changed. Please update your fs2json (https://github.com/copy/fs2json) and recreate the filesystem JSON.";var t=e.fsroot;this.used_size=e.size;var s=this;setTimeout(function(){
for(var e=0;e<t.length;e++)s.LoadRecursive(t[e],0);s.OnLoaded(),s.OnLoaded=function(){}},0)},FS.prototype.LoadRecursive=function(e,t){var s=this.CreateInode();s.name=e[0],s.size=e[1],s.mtime=e[2],s.ctime=s.mtime,s.atime=s.mtime,s.mode=e[3],s.uid=e[4],s.gid=e[5],s.parentid=t,t=s.mode&S_IFMT,t===S_IFDIR?this.LoadDir(s,e[JSONFS_IDX_TARGET]):t===S_IFREG?(s.status=STATUS_ON_SERVER,this.PushInode(s)):t===S_IFLNK?(s.symlink=e[JSONFS_IDX_TARGET],this.PushInode(s)):t!==S_IFSOCK&&dbg_log("Unexpected ifmt: "+h(t)+" ("+s.name+")")},FS.prototype.LoadDir=function(e,t){e.updatedir=!0;var s=this.inodes.length;for(this.PushInode(e),e=0;e<t.length;e++)this.LoadRecursive(t[e],s)},FS.prototype.LoadFile=function(e){var t=this.inodes[e];t.status==STATUS_ON_SERVER&&(t.status=3,this.filesinloadingqueue++,this.baseurl&&LoadBinaryResource(this.baseurl+this.GetFullPath(t.fid),function(s){s=this.inodedata[e]=new Uint8Array(s),t.size=s.length,t.status=STATUS_OK,this.filesinloadingqueue--,this.HandleEvent(e)}.bind(this),function(e){throw e}))},FS.prototype.PushInode=function(e){if(-1!=e.parentid){this.inodes.push(e),e.fid=this.inodes.length-1;var t=this.inodes[e.parentid];t.updatedir=!0,e.nextid=t.firstid,t.firstid=this.inodes.length-1}else 0==this.inodes.length?this.inodes.push(e):(message.Debug("Error in Filesystem: Pushed inode with name = "+e.name+" has no parent"),message.Abort())},FS.prototype.CreateInode=function(){return new Inode(++this.qidnumber)},FS.prototype.CreateDirectory=function(e,t){var s=this.CreateInode();return s.name=e,s.parentid=t,s.mode=511|S_IFDIR,s.updatedir=!0,0<=t&&(s.uid=this.inodes[t].uid,s.gid=this.inodes[t].gid,s.mode=511&this.inodes[t].mode|S_IFDIR),s.qid.type=S_IFDIR>>8,this.PushInode(s),this.NotifyListeners(this.inodes.length-1,"newdir"),this.inodes.length-1},FS.prototype.CreateFile=function(e,t){var s=this.CreateInode();return s.name=e,s.parentid=t,s.uid=this.inodes[t].uid,s.gid=this.inodes[t].gid,s.qid.type=S_IFREG>>8,s.mode=438&this.inodes[t].mode|S_IFREG,this.PushInode(s),this.NotifyListeners(this.inodes.length-1,"newfile"),this.inodes.length-1},FS.prototype.CreateNode=function(e,t,s,r){var i=this.CreateInode();return i.name=e,i.parentid=t,i.major=s,i.minor=r,i.uid=this.inodes[t].uid,i.gid=this.inodes[t].gid,i.qid.type=S_IFSOCK>>8,i.mode=438&this.inodes[t].mode,this.PushInode(i),this.inodes.length-1},FS.prototype.CreateSymlink=function(e,t,s){var r=this.CreateInode();return r.name=e,r.parentid=t,r.uid=this.inodes[t].uid,r.gid=this.inodes[t].gid,r.qid.type=S_IFLNK>>8,r.symlink=s,r.mode=S_IFLNK,this.PushInode(r),this.inodes.length-1},FS.prototype.CreateTextFile=function(e,t,s){e=this.CreateFile(e,t);var r=this.inodes[e];for(t=this.inodedata[e]=new Uint8Array(s.length),r.size=s.length,r=0;r<s.length;r++)t[r]=s.charCodeAt(r);return e},FS.prototype.CreateBinaryFile=function(e,t,s){return e=this.CreateFile(e,t),t=this.inodes[e],(this.inodedata[e]=new Uint8Array(s.length)).set(s),t.size=s.length,e},FS.prototype.OpenInode=function(e,t){return t=this.GetInode(e),(t.mode&S_IFMT)==S_IFDIR&&this.FillDirectory(e),t.status!=STATUS_ON_SERVER||(this.LoadFile(e),!1)},FS.prototype.CloseInode=function(e){var t=this.GetInode(e);t.status==STATUS_UNLINKED&&(t.status=STATUS_INVALID,delete this.inodedata[e],t.size=0)},FS.prototype.Rename=function(e,t,s,r){if(e==s&&t==r)return!0;t=this.Search(e,t);var i=this.GetFullPath(t);if(-1==t)return!1;var _=this.Search(s,r);if(-1!=_&&this.Unlink(_),_=this.inodes[t],this.inodes[_.parentid].firstid==t)this.inodes[_.parentid].firstid=_.nextid;else{var a=this.FindPreviousID(t);-1==a&&(message.Debug("Error in Filesystem: Cannot find previous id of inode"),message.Abort()),this.inodes[a].nextid=_.nextid}return _.parentid=s,_.name=r,_.qid.version++,_.nextid=this.inodes[_.parentid].firstid,this.inodes[_.parentid].firstid=t,this.inodes[e].updatedir=!0,this.inodes[s].updatedir=!0,this.NotifyListeners(t,"rename",{oldpath:i}),!0},FS.prototype.Write=function(e,t,s,r){this.NotifyListeners(e,"write");var i=this.inodes[e],_=this.inodedata[e];for(!_||_.length<t+s?(this.ChangeSize(e,Math.floor(3*(t+s)/2)),i.size=t+s,_=this.inodedata[e]):i.size<t+s&&(i.size=t+s),e=0;e<s;e++)_[t+e]=r()},FS.prototype.Search=function(e,t){for(var s=this.inodes[e].firstid;-1!=s;){if(this.inodes[s].parentid!=e&&message.Debug("Error in Filesystem: Found inode with wrong parent id"),this.inodes[s].name==t)return s;s=this.inodes[s].nextid}return-1},FS.prototype.GetTotalSize=function(){return this.used_size},FS.prototype.GetSpace=function(){return this.total_size},FS.prototype.GetFullPath=function(e){for(var t="";0!=e;)t="/"+this.inodes[e].name+t,e=this.inodes[e].parentid;return t.substring(1)},FS.prototype.FindPreviousID=function(e){var t=this.GetInode(e);for(t=this.inodes[t.parentid].firstid;-1!=t&&this.inodes[t].nextid!=e;)t=this.inodes[t].nextid;return t},FS.prototype.Unlink=function(e){if(this.NotifyListeners(e,"delete"),0==e)return!1;var t=this.GetInode(e);return((t.mode&S_IFMT)!=S_IFDIR||-1==t.firstid)&&(this.inodes[t.parentid].firstid==e?this.inodes[t.parentid].firstid=t.nextid:(e=this.FindPreviousID(e),-1==e&&(message.Debug("Error in Filesystem: Cannot find previous id of inode"),message.Abort()),this.inodes[e].nextid=t.nextid),this.inodes[t.parentid].updatedir=!0,t.status=STATUS_UNLINKED,t.nextid=-1,t.firstid=-1,t.parentid=-1,!0)},FS.prototype.GetInode=function(e){return isNaN(e)?(message.Debug("Error in filesystem: id is not a number "),0):0>e||e>this.inodes.length?(message.Debug("Error in filesystem: Attempt to get inode with id "+e),0):this.inodes[e]},FS.prototype.ChangeSize=function(e,t){var s=this.GetInode(e),r=this.inodedata[e];if(t!=s.size&&(e=this.inodedata[e]=new Uint8Array(t),s.size=t,r))for(t=Math.min(r.length,s.size),s=0;s<t;s++)e[s]=r[s]},FS.prototype.SearchPath=function(e){e=e.replace("//","/"),e=e.split("/");var t=e.length;0==e[t-1].length&&e.pop(),0==e[0].length&&e.shift(),t=e.length;for(var s=0,r=-1,i=0;i<t;i++){if(-1==(r=this.Search(s,e[i])))return i<t-1?{id:-1,parentid:-1,name:e[i]}:{id:-1,parentid:s,name:e[i]};s=r}return{id:r,parentid:s,name:e[i]}},FS.prototype.GetRecursiveList=function(e,t){for(e=this.inodes[e].firstid;-1!=e;)t.push(e),(this.inodes[e].mode&S_IFMT)==S_IFDIR&&this.GetRecursiveList(e,t),e=this.inodes[e].nextid},FS.prototype.MergeFile=function(e){message.Debug("Merge path:"+e.name);var t=this.SearchPath(e.name);-1!=t.parentid&&(-1==t.id&&(t.id=this.CreateFile(t.name,t.parentid)),this.inodes[t.id].data=e.data,this.inodes[t.id].size=e.data.length)},FS.prototype.RecursiveDelete=function(e){var t=[];if(e=this.SearchPath(e),-1!=e.parentid&&-1!=e.id)for(this.GetRecursiveList(e.id,t),e=t.length-1;0<=e;e--)this.Unlink(t[e])},FS.prototype.DeleteNode=function(e){if(e=this.SearchPath(e),-1!=e.parentid&&-1!=e.id)if((this.inodes[e.id].mode&S_IFMT)==S_IFREG)this.Unlink(e.id);else if((this.inodes[e.id].mode&S_IFMT)==S_IFDIR){var t=[];this.GetRecursiveList(e.id,t);for(var s=t.length-1;0<=s;s--)this.Unlink(t[s]);this.Unlink(e.id)}},FS.prototype.NotifyListeners=function(e,t,s){},FS.prototype.Check=function(){for(var e=1;e<this.inodes.length;e++)if(this.inodes[e].status!=STATUS_INVALID){this.inodes[e].nextid==e&&(message.Debug("Error in filesystem: file points to itself"),message.Abort());var t=this.GetInode(e);0>t.parentid&&message.Debug("Error in filesystem: negative parent id "+e),0==t.name.length&&message.Debug("Error in filesystem: inode with no name and id "+e);for(var s in t.name)32>t.name.charCodeAt(s)&&message.Debug("Error in filesystem: Unallowed char in filename")}},FS.prototype.FillDirectory=function(e){var t=this.GetInode(e);if(t.updatedir){var s=t.parentid;-1==s&&(s=0);for(var r=0,i=this.inodes[e].firstid;-1!=i;)r+=24+UTF8.UTF8Length(this.inodes[i].name),i=this.inodes[i].nextid;r=r+25+26;var _=this.inodedata[e]=new Uint8Array(r);for(t.size=r,r=0,r+=marshall.Marshall(["Q","d","b","s"],[this.inodes[e].qid,r+13+8+1+2+1,this.inodes[e].mode>>12,"."],_,r),r+=marshall.Marshall(["Q","d","b","s"],[this.inodes[s].qid,r+13+8+1+2+2,this.inodes[s].mode>>12,".."],_,r),i=this.inodes[e].firstid;-1!=i;)r+=marshall.Marshall(["Q","d","b","s"],[this.inodes[i].qid,r+13+8+1+2+UTF8.UTF8Length(this.inodes[i].name),this.inodes[i].mode>>12,this.inodes[i].name],_,r),i=this.inodes[i].nextid;t.updatedir=!1}},FS.prototype.PrepareCAPs=function(e){return e=this.GetInode(e),e.caps?e.caps.length:(e.caps=new Uint8Array(12),e.caps[0]=0,e.caps[1]=0,e.caps[2]=0,e.caps[3]=1,e.caps[4]=255,e.caps[5]=255,e.caps[6]=255,e.caps[7]=255,e.caps[8]=255,e.caps[9]=255,e.caps[10]=255,e.caps[11]=255,e.caps.length)};var VIRTIO_MAGIC_REG=0,VIRTIO_VERSION_REG=4,VIRTIO_DEVICE_REG=8,VIRTIO_VENDOR_REG=12,VIRTIO_HOSTFEATURES_REG=16,VIRTIO_HOSTFEATURESSEL_REG=20,VIRTIO_GUESTFEATURES_REG=32,VIRTIO_GUESTFEATURESSEL_REG=36,VIRTIO_GUEST_PAGE_SIZE_REG=40,VIRTIO_QUEUESEL_REG=48,VIRTIO_QUEUENUMMAX_REG=52,VIRTIO_QUEUENUM_REG=56,VIRTIO_QUEUEALIGN_REG=60,VIRTIO_QUEUEPFN_REG=64,VIRTIO_QUEUENOTIFY_REG=80,VIRTIO_INTERRUPTSTATUS_REG=96,VIRTIO_INTERRUPTACK_REG=100,VIRTIO_STATUS_REG=112,VRING_DESC_F_NEXT=1,VRING_DESC_F_WRITE=2,VRING_DESC_F_INDIRECT=4,message={Debug:function(e){dbg_log([].slice.apply(arguments).join(" "),LOG_9P)},Abort:function(){if(DEBUG)throw"abort"}},LoadBinaryResource;LoadBinaryResource="undefined"!=typeof XMLHttpRequest?function(e,t,s){var r=new XMLHttpRequest;r.open("GET",e,!0),r.responseType="arraybuffer",r.onreadystatechange=function(){if(4==r.readyState)if(200!=r.status&&0!=r.status)s("Error: Could not load file "+e);else{var i=r.response;i?t(i):s("Error: No data received from: "+e)}},r.send(null)}:function(e,t,s){require("fs").readFile(e,function(e,r){e?s(e):t(new Uint8Array(r).buffer)})};var marshall={Marshall:function(e,t,s,r){for(var i,_=0,a=0;a<e.length;a++)switch(i=t[a],e[a]){case"w":s[r++]=255&i,s[r++]=i>>8&255,s[r++]=i>>16&255,s[r++]=i>>24&255,_+=4;break;case"d":s[r++]=255&i,s[r++]=i>>8&255,s[r++]=i>>16&255,s[r++]=i>>24&255,s[r++]=0,s[r++]=0,s[r++]=0,s[r++]=0,_+=8;break;case"h":s[r++]=255&i,s[r++]=i>>8,_+=2;break;case"b":s[r++]=i,_+=1;break;case"s":var o=r,n=0;s[r++]=0,s[r++]=0,_+=2;for(var d in i)UnicodeToUTF8Stream(i.charCodeAt(d)).forEach(function(e){s[r++]=e,_+=1,n++});s[o+0]=255&n,s[o+1]=n>>8&255;break;case"Q":marshall.Marshall(["b","w","d"],[i.type,i.version,i.path],s,r),r+=13,_+=13;break;default:message.Debug("Marshall: Unknown type="+e[a])}return _},Unmarshall:function(e,t,s){for(var r=[],i=0;i<e.length;i++)switch(e[i]){case"w":var _=t[s++];_+=t[s++]<<8,_+=t[s++]<<16,_+=t[s++]<<24>>>0,r.push(_);break;case"d":_=t[s++],_+=t[s++]<<8,_+=t[s++]<<16,_+=t[s++]<<24>>>0,s+=4,r.push(_);break;case"h":_=t[s++],r.push(_+(t[s++]<<8));break;case"b":r.push(t[s++]);break;case"s":_=t[s++],_+=t[s++]<<8;for(var a="",o=new UTF8StreamToUnicode,n=0;n<_;n++){var d=o.Put(t[s++]);-1!=d&&(a+=String.fromCharCode(d))}r.push(a);break;default:message.Debug("Error in Unmarshall: Unknown type="+e[i])}return r},Unmarshall2:function(e,t){for(var s=[],r=0;r<e.length;r++)switch(e[r]){case"w":var i=t();i+=t()<<8,i+=t()<<16,i+=t()<<24>>>0,s.push(i);break;case"d":i=t(),i+=t()<<8,i+=t()<<16,i+=t()<<24>>>0,t(),t(),t(),t(),s.push(i);break;case"h":i=t(),s.push(i+(t()<<8));break;case"b":s.push(t());break;case"s":i=t(),i+=t()<<8;for(var _="",a=new UTF8StreamToUnicode,o=0;o<i;o++){var n=a.Put(t());-1!=n&&(_+=String.fromCharCode(n))}s.push(_);break;default:message.Debug("Error in Unmarshall2: Unknown type="+e[r])}return s}},UTF8={};UTF8.UTF8Length=function(e){for(var t=0,s=0;s<e.length;s++){t+=128>e.charCodeAt(s)?1:2}return t}}).call(this);
//# sourceMappingURL=./libv86.min.js.map