(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=127E?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){et;)a.removeChild(a.firstChild);for(;a.childNodes.lengtht;t++)this.ports[t]=this.create_empty_entry();var s=e.memory_size;for(t=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>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< 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< 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< 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< 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),PIC_LOG_VERBOSE&&dbg_log("master> clear irq "+e,LOG_PIC),8<=e?this.slave.clear_irq(e-8):(e=1<e),PIC_LOG_VERBOSE&&dbg_log("slave > set irq "+e,LOG_PIC),e=1<e),PIC_LOG_VERBOSE&&dbg_log("slave > clear irq "+e,LOG_PIC),e=1<>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<>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>>0,(u<=s?_>u&&_<=s:_>u||_<=s)&&(_=4&r,2&r?(_=_&&!(d&1<>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>>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>>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>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;rs;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;ss)*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=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>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:0s?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;_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 te?-t:t}},"es6","es3"),$jscomp.iteratorFromArray=function(e,t){$jscomp.initSymbolIterator(),e instanceof String&&(e+="");var s=0,r={next:function(){if(s')},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('")):goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING?goog.appendScriptSrcNode_(e):goog.writeScriptSrcNode_(e):s.write('"),!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>>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=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>>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>>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>>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.lengtht;t++)t&t-1||s++,e[t]=s;v86util.int_log2_byte=function(t){return dbg_assert(0t),e[t]},v86util.int_log2=function(t){dbg_assert(0>>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;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>this.stack_ptr&1?(this.status_word&=~FPU_C1,this.stack_empty&=~(1<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<>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<>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){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>>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(tt;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>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>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>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>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<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<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),sn&&(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]>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=ethis.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=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-7this.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>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=ethis.diff_addr_max?e:this.diff_addr_max},VGAScreen.prototype.svga_memory_write32=function(e,t){e&=268435455,this.diff_addr_min=ethis.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>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_crtcMAX_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>2,a=1+(i>>2);for(t=_;t>16&255|65280&i|4278190080;break;case 24:_=r/3|0,a=1+(i/3|0);var o=3*_;for(t=_;o>1,a=1+(i>>1),t=_;t>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>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>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>(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<>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<>>0)&&(this.next_tick+=e/TSC_RATE*(1<=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)dbg_assert(!1,"Bad irq: "+e,LOG_APIC);else{var t=1<=IOAPIC_IRQ_COUNT)dbg_assert(!1,"Bad irq: "+e,LOG_APIC);else{var t=1<>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>>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>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;et;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>>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=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=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++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;ee?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>>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>>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.dplthis.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.rpla.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.rplr.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.dplthis.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.dplthis.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<>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>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>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 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.dplt;)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>>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>>=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=127e?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=32767e?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=32767e?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(1048576t;)_>>>=1,i--;for(;1048576=_){t-=_;var a=s<>>0;a>e&&t--,e=e-a>>>0,r|=1<>=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),(153e):this.flags&=~flag_adjust,(153>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<>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<>>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<>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<>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<>>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-1&1|(s>>20^s>>19)&flag_overflow,s},CPU.prototype.shl8=function(e,t){return 0===t?e:(this.last_result=e<>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<>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<>>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<>>16-s,this.flags=-2&this.flags|e>>>16-s&1):(this.last_result=e>>32-s|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<>>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&1,this.flags_changed&=-2,e|1<>t&1,this.flags_changed&=-2,e&~(1<>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<>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<>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<>>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>>=0,4294934528>>=0,4294967168e&&(e=0),dbg_assert(0==(4294967040&e)),e},CPU.prototype.saturate_ud_to_ub=function(e){return e>>>=0,255>>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>>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>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)<>>16<>>16<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,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<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<>>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[_]>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>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,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)<>>16<>>16<>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<>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<>>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<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>>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>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>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>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||126s;s++){t=h(128*s*e,8)+" | ";for(var r=0;128>r;r++)t+=0e)){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>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=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>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;re||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;st.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>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>>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>>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