v86 0.5.199 → 0.5.244
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/libv86-debug.js +2287 -2736
- package/build/libv86-debug.mjs +678 -700
- package/build/libv86.js +371 -391
- package/build/libv86.mjs +574 -591
- package/build/v86-debug.wasm +0 -0
- package/build/v86-fallback.wasm +0 -0
- package/build/v86.wasm +0 -0
- package/package.json +1 -1
package/build/libv86-debug.mjs
CHANGED
|
@@ -1,569 +1,547 @@
|
|
|
1
|
-
;let module = {exports:{}}; const aa=[[1,""],[2,"CPU"],[32768,"DISK"],[4,"FPU"],[8,"MEM"],[16,"DMA"],[32,"IO"],[64,"PS2"],[128,"PIC"],[256,"VGA"],[512,"PIT"],[1024,"MOUS"],[2048,"PCI"],[4096,"BIOS"],[8192,"FLOP"],[16384,"SERI"],[65536,"RTC"],[262144,"ACPI"],[524288,"APIC"],[1048576,"NET"],[2097152,"VIO"],[4194304,"9P"],[8388608,"SB16"],[16777216,"FETC"]];function ca(a,b){return(a||0===a?a+"":"").padEnd(b," ")}function da(a,b){return(a||0===a?a+"":"").padStart(b,"0")}function
|
|
2
|
-
f){e=new a(b.buffer,c,d);const
|
|
3
|
-
require("crypto");ea=function(){return a.randomBytes(4).readInt32LE(0)}}else"undefined"!==typeof process?import("node:crypto").then(a=>{ea=function(){return a.randomBytes(4).readInt32LE(0)}}):
|
|
4
|
-
16+ha[b]}return(c=a>>>8)?8+ha[c]:ha[a]}}function
|
|
5
|
-
function(){return this.length?b[c]:-1};this.clear=function(){this.length=d=c=0};this.clear()}function oa(a){this.size=a;this.data=new Float32Array(a);this.length=this.end=this.start=0;
|
|
6
|
-
function(a){var b=new Float32Array(a);a>this.length&&(a=this.length);var c=this.start+a,d=this.data.subarray(this.start,c);b.set(d);c>=this.size&&(c-=this.size,b.set(this.data.subarray(0,c),d.length));this.start=c;this.length-=a;return b};oa.prototype.peek=function(){if(this.length)return this.data[this.start]};oa.prototype.clear=function(){this.length=this.end=this.start=0};function
|
|
7
|
-
a.dataset.downloadurl=["application/octet-stream",a.download,a.href].join(":");document.createEvent?(b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),a.dispatchEvent(b)):a.click();window.URL.revokeObjectURL(a.href)}function ra(a){"number"===typeof a?this.view=new Uint8Array(a+7>>3):a instanceof ArrayBuffer?this.view=new Uint8Array(a):
|
|
8
|
-
a:this.view[c]&~a};ra.prototype.get=function(a){return this.view[a>>3]>>(a&7)&1};ra.prototype.get_buffer=function(){return this.view.buffer};var
|
|
9
|
-
c.done(new Uint8Array(f))}else d=await a.readFile(b,{encoding:c.as_json?"utf-8":null}),d=c.as_json?JSON.parse(d):(new Uint8Array(d)).buffer,c.done(d)};ua=async function(b){a||(a=await import("node:fs/promises"));return(await a.stat(b)).size}}else
|
|
10
|
-
|
|
11
|
-
500<=e.status&&600>e.status&&d();else if(e.response){if(b.range){const m=e.getResponseHeader("Content-Encoding");m&&"identity"!==m&&console.error("Server sent Content-Encoding in response to ranged request",{filename:a,enc:m})}b.done&&b.done(e.response,e)}};e.onerror=function(m){console.error("Loading the image "+a+" failed",m);d()};b.progress&&(e.onprogress=function(m){b.progress(m)});e.send(null)},ua=async function(a){return new Promise((b,c)=>{
|
|
12
|
-
"";(e=d.match(/\/(\d+)\s*$/))?b(+e[1]):c(Error("`Range: bytes=...` header not supported (Got `"+d+"`)"))},headers:{Range:"bytes=0-0","X-Accept-Encoding":"identity"}})})};var
|
|
13
|
-
b):console.log("Previous message repeated "+c+" times"),c=0);console.log(e+d);b=d}}}();function
|
|
14
|
-
U||ba;S[R+3]=ba;S[R+7]=ba;R+=8}:function(ba){U=U||ba;S[R+3]=ba;R+=4};M=32-T;const
|
|
15
|
-
(1===w?"":" scaleX("+w+")")+(1===G?"":" scaleY("+G+")"):(0===w%1&&0===G%1?(
|
|
16
|
-
1;this.FLAG_FONT_PAGE_B=2;var
|
|
17
|
-
8593,8595,8594,8592,8735,8596,9650,9660]),w=new Uint16Array([8962,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,
|
|
18
|
-
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 G=0,M;256>G;G++)M=126<G?w[G-127]:32>G?y[G]:G,
|
|
19
|
-
function(){const y=new Image;if(1===u||2===u)y.src=
|
|
20
|
-
p.style.backgroundColor,M.fillRect(r*w[0],q*w[1]+parseInt(p.style.marginTop,10),parseInt(p.style.width,10),parseInt(p.style.height,10)));y.src=G.toDataURL("image/png")}return y};this.put_char=function(y,w,G,M,S,R){
|
|
21
|
-
this.timer()};this.update_text=function(){for(var y=0;y<x;y++)A[y]&&(this.text_update_row(y),A[y]=0)};this.update_graphical=function(){this.screen_fill_buffer()};this.update_graphical_text=function(){if(N){var y=performance.now();if(266<y-
|
|
22
|
-
continue}++U;V.clearRect(0,R,S,T);let
|
|
23
|
-
0,S,T);V.globalCompositeOperation="source-over";N.fillStyle=c(
|
|
24
|
-
0===u?(m.style.display="block",
|
|
25
|
-
function(){if(
|
|
26
|
-
w;)m.appendChild(document.createElement("div"));for(y=0;y<w;y++)this.text_update_row(y);e(m,v,t,!0)}else 2===u&&this.set_size_graphical_text()};this.set_size_graphical=function(y,w){
|
|
27
|
-
function(y,w,G){if(y!==
|
|
28
|
-
U.style.backgroundColor=c(ja);U.style.color=c(ba);for(G="";R<F&&(E[w+1]&1)===
|
|
29
|
-
function(){for(var y=[],w=0;w<x;w++)y.push(this.get_text_row(w));return y};this.get_text_row=function(y){let w="";for(let G=0;G<F;G++)w+=
|
|
30
|
-
b.byteLength<=this.byteLength);(new Uint8Array(this.buffer,a,b.byteLength)).set(b);c()};
|
|
31
|
-
this.onload=void 0}
|
|
32
|
-
this.get_from_cache(a,b);if(d)c(d);else{var e=a,f=b;this.fixed_chunk_size&&(e=a-a%this.fixed_chunk_size,f=Math.ceil((a-e+b)/this.fixed_chunk_size)*this.fixed_chunk_size);
|
|
33
|
-
e);if(void 0===f)f=b.slice(256*e,256*(e+1)),this.block_cache.set(a+e,f);else{const
|
|
34
|
-
this.block_cache_is_write.has(c)&&b.push([c,d]);a[0]=b;return a};
|
|
35
|
-
this.block_cache=new Map;this.block_cache_is_write=new Set;this.byteLength=b;this.fixed_chunk_size=c;this.partfile_alt_format=!!d;this.zstd_decompress=e;this.cache_reads=!!c;this.onprogress=this.onload=void 0}
|
|
36
|
-
|
|
37
|
-
(r=await this.zstd_decompress(this.fixed_chunk_size,r),r=new Uint8Array(r));m.set(r,q*this.fixed_chunk_size);this.handle_read((f+q)*this.fixed_chunk_size,this.fixed_chunk_size|0,r);p++;p===
|
|
38
|
-
Aa.prototype.get_state=
|
|
39
|
-
this.load_next(a+4194304)}.bind(this);if(this.onprogress)this.onprogress({loaded:a,total:this.byteLength,lengthComputable:!0});if(a<this.byteLength){var c=this.file.slice(a,Math.min(a+4194304,this.byteLength));b.readAsArrayBuffer(c)}else this.file=void 0,this.onload&&this.onload({buffer:this.buffer})};
|
|
40
|
-
function
|
|
41
|
-
|
|
42
|
-
this.file.size&&b.push(this.file.slice(d));a=new File(b,a);
|
|
43
|
-
a;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;a=a.io;a.register_write(0,
|
|
44
|
-
this,this.port_addr_write.bind(this,
|
|
45
|
-
|
|
46
|
-
this.port_addr_write.bind(this,
|
|
47
|
-
|
|
48
|
-
this,this.port_page_write.bind(this,
|
|
49
|
-
|
|
50
|
-
a.register_write(
|
|
51
|
-
this,this.port_pagehi_read.bind(this,7));a.register_write(10,this,this.port_singlemask_write.bind(this,0));a.register_write(212,this,this.port_singlemask_write.bind(this,4));a.register_write(15,this,this.port_multimask_write.bind(this,0));a.register_write(222,this,this.port_multimask_write.bind(this,4));a.register_read(15,this,this.port_multimask_read.bind(this,0));a.register_read(222,this,this.port_multimask_read.bind(this,
|
|
52
|
-
this,this.port_mode_write.bind(this,4));a.register_write(12,this,this.portC_write);a.register_write(216,this,this.portC_write)}C.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]};C.prototype.set_state=function(a){this.channel_page=a[0];this.channel_pagehi=
|
|
53
|
-
a[4];this.channel_count_init=a[5];this.channel_mask=a[6];this.channel_mode=a[7];this.lsb_msb_flipflop=a[8]};C.prototype.port_count_write=function(a,b){B("count write ["+a+"] = "+n(b),16);this.channel_count[a]=this.flipflop_get(this.channel_count[a],b,!1);this.channel_count_init[a]=this.flipflop_get(this.channel_count_init[a],b,!0)};C.prototype.port_count_read=function(a){B("count read ["+a+"] -> "+n(this.channel_count[a]),
|
|
54
|
-
function(a,b){B("addr write ["+a+"] = "+n(b),16);this.channel_addr[a]=this.flipflop_get(this.channel_addr[a],b,!1);this.channel_addr_init[a]=this.flipflop_get(this.channel_addr_init[a],b,!0)};C.prototype.port_addr_read=function(a){B("addr read ["+a+"] -> "+n(this.channel_addr[a]),16);return this.flipflop_read(this.channel_addr[a])};C.prototype.port_pagehi_write=function(a,b){B("pagehi write ["+a+"] = "+n(b),16);this.channel_pagehi[a]=
|
|
55
|
-
"]",16);return this.channel_pagehi[a]};C.prototype.port_page_write=function(a,b){B("page write ["+a+"] = "+n(b),16);this.channel_page[a]=b};C.prototype.port_page_read=function(a){B("page read ["+a+"]",16);return this.channel_page[a]};C.prototype.port_singlemask_write=function(a,b){a=(b&3)+a;b=b&4?1:0;B("singlechannel mask write ["+a+"] = "+b,16);this.update_mask(a,b)};C.prototype.port_multimask_write=function(a,b){B("multichannel mask write: "+
|
|
56
|
-
c)};C.prototype.port_multimask_read=function(a){var b=0|this.channel_mask[a+0];b|=this.channel_mask[a+1]<<1;b|=this.channel_mask[a+2]<<2;b|=this.channel_mask[a+3]<<3;B("multichannel mask read: "+n(b),16);return b};C.prototype.port_mode_write=function(a,b){a=(b&3)+a;B("mode write ["+a+"] = "+n(b),16);this.channel_mode[a]=b};C.prototype.portC_write=function(){B("flipflop reset",16);this.lsb_msb_flipflop=0};C.prototype.on_unmask=function(a,b){this.unmask_listeners.push({fn:a,
|
|
57
|
-
function(a,b){if(this.channel_mask[a]!==b&&(this.channel_mask[a]=b,!b))for(B("firing on_unmask("+a+")",16),b=0;b<this.unmask_listeners.length;b++)this.unmask_listeners[b].fn.call(this.unmask_listeners[b].this_value,a)};C.prototype.do_read=function(a,b,c,d,e){var f=this.count_get_8bit(d),
|
|
58
|
-
this.cpu;this.channel_addr[d]+=f;a.get(b,f,function(m){
|
|
59
|
-
f,this.channel_count[d]-=f,!p&&r&&(B("DMA autoinit",16),this.channel_addr[d]=this.channel_addr_init[d],this.channel_count[d]=this.channel_count_init[d]),a.set(b,this.cpu.mem8.subarray(m,m+
|
|
60
|
-
a&&(b*=2);return b};C.prototype.flipflop_get=function(a,b,c){c||(this.lsb_msb_flipflop^=1);return this.lsb_msb_flipflop?a&-256|b:a&-65281|b<<8};C.prototype.flipflop_read=function(a){return(this.lsb_msb_flipflop^=1)?a&255:a>>8&255};function
|
|
61
|
-
4294967296-c,function(d){B("Read from unmapped memory space, addr="+n(d>>>0,8),32);return 255},function(d,e){B("Write to unmapped memory space, addr="+n(d>>>0,8)+" value="+n(e,2),32)},function(d){B("Read from unmapped memory space, addr="+n(d>>>0,8),32);return-1},function(d,e){B("Write to unmapped memory space, addr="+n(d>>>0,8)+" value="+n(e>>>0,8),32)})}
|
|
62
|
-
write16:this.empty_port_write,write32:this.empty_port_write,device:void 0}};
|
|
63
|
-
typeof d);
|
|
64
|
-
8));d||(d=f.bind(this,16));e||(e=f.bind(this,32));c&&(this.ports[a].write8=c);d&&(this.ports[a].write16=d);e&&(this.ports[a].write32=e);this.ports[a].device=b};
|
|
65
|
-
1,b,d),this.register_read(a+2,b,e,
|
|
66
|
-
b,d),this.register_write(a+2,b,e,
|
|
67
|
-
|
|
68
|
-
function(a,b){var c=this.ports[a];c.write16===this.empty_port_write&&B("write16 port #"+n(a,4)+" <- "+n(b,4)+this.get_port_description(a),32);return c.write16.call(c.device,b)};
|
|
69
|
-
32);b=b.read8.call(b.device,a);
|
|
70
|
-
n(a,4)+this.get_port_description(a),32);a=b.read32.call(b.device,a);
|
|
71
|
-
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",
|
|
72
|
-
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"};
|
|
73
|
-
b){var c=this.listeners[a];void 0!==c&&(this.listeners[a]=c.filter(function(d){return d.fn!==b}))};
|
|
74
|
-
Qa=[];function D(a,b){this.cpu=a;this.bus=b;this.write_buffer=new na(64);this.read_buffer=new na(64);this.mixer_current_address=this.command_size=this.command=this.read_buffer_lastvalue=0;this.mixer_registers=new Uint8Array(256);this.mixer_reset();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 oa(65536),new oa(65536)];this.dma=
|
|
75
|
-
this.dma_bytes_count=this.dma_sample_count=0;this.dma_channel_8bit=1;this.dma_channel_16bit=5;this.dma_autoinit=!1;this.dma_buffer=new ArrayBuffer(65536);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
|
|
76
|
-
this.sampling_rate);this.bytes_per_sample=1;this.e2_value=170;this.e2_count=0;this.asp_registers=new Uint8Array(256);this.mpu_read_buffer=new na(64);this.fm_current_address1=this.fm_current_address0=this.mpu_read_buffer_lastvalue=0;this.fm_waveform_select_enable=!1;this.irq=5;this.irq_triggered=new Uint8Array(16);a.io.register_read_consecutive(544,this,this.port2x0_read,this.port2x1_read,this.port2x2_read,this.port2x3_read);
|
|
77
|
-
a.io.register_read_consecutive(548,this,this.port2x4_read,this.port2x5_read);a.io.register_read(550,this,this.port2x6_read);a.io.register_read(551,this,this.port2x7_read);a.io.register_read(552,this,this.port2x8_read);a.io.register_read(553,this,this.port2x9_read);a.io.register_read(554,this,this.port2xA_read);a.io.register_read(555,this,this.port2xB_read);a.io.register_read(556,this,this.port2xC_read);a.io.register_read(557,
|
|
78
|
-
this.port2xF_read);a.io.register_write_consecutive(544,this,this.port2x0_write,this.port2x1_write,this.port2x2_write,this.port2x3_write);a.io.register_write_consecutive(904,this,this.port2x0_write,this.port2x1_write);a.io.register_write_consecutive(548,this,this.port2x4_write,this.port2x5_write);a.io.register_write(550,this,this.port2x6_write);a.io.register_write(551,this,this.port2x7_write);a.io.register_write_consecutive(552,
|
|
79
|
-
this.port2xA_write);a.io.register_write(555,this,this.port2xB_write);a.io.register_write(556,this,this.port2xC_write);a.io.register_write(557,this,this.port2xD_write);a.io.register_write(558,this,this.port2xE_write);a.io.register_write(559,this,this.port2xF_write);a.io.register_read_consecutive(816,this,this.port3x0_read,this.port3x1_read);a.io.register_write_consecutive(816,this,this.port3x0_write,this.port3x1_write);this.dma.on_unmask(this.dma_on_unmask,
|
|
80
|
-
this);b.register("speaker-has-initialized",function(){this.mixer_reset()},this);b.send("speaker-confirm-initialized");this.dsp_reset()}D.prototype.dsp_reset=function(){this.write_buffer.clear();this.read_buffer.clear();this.command_size=this.command=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();
|
|
81
|
-
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(1);this.irq_triggered.fill(0);this.asp_registers.fill(0);this.asp_registers[5]=1;this.asp_registers[9]=248};D.prototype.get_state=function(){var a=[];a[2]=this.read_buffer_lastvalue;a[3]=this.command;
|
|
82
|
-
this.dummy_speaker_enabled;a[8]=this.test_register;a[9]=this.dsp_highspeed;a[10]=this.dsp_stereo;a[11]=this.dsp_16bit;a[12]=this.dsp_signed;a[15]=this.dma_sample_count;a[16]=this.dma_bytes_count;a[17]=this.dma_bytes_left;a[18]=this.dma_bytes_block;a[19]=this.dma_irq;a[20]=this.dma_channel;a[21]=this.dma_channel_8bit;a[22]=this.dma_channel_16bit;a[23]=this.dma_autoinit;a[24]=this.dma_buffer_uint8;a[25]=this.dma_waiting_transfer;
|
|
83
|
-
a[29]=this.e2_value;a[30]=this.e2_count;a[31]=this.asp_registers;a[33]=this.mpu_read_buffer_last_value;a[34]=this.irq;a[35]=this.irq_triggered;return a};D.prototype.set_state=function(a){this.read_buffer_lastvalue=a[2];this.command=a[3];this.command_size=a[4];this.mixer_current_address=a[5];this.mixer_registers=a[6];this.mixer_full_update();this.dummy_speaker_enabled=a[7];this.test_register=a[8];this.dsp_highspeed=a[9];this.dsp_stereo=
|
|
84
|
-
a[15];this.dma_bytes_count=a[16];this.dma_bytes_left=a[17];this.dma_bytes_block=a[18];this.dma_irq=a[19];this.dma_channel=a[20];this.dma_channel_8bit=a[21];this.dma_channel_16bit=a[22];this.dma_autoinit=a[23];this.dma_buffer_uint8=a[24];this.dma_waiting_transfer=a[25];this.dma_paused=a[26];this.sampling_rate=a[27];this.bytes_per_sample=a[28];this.e2_value=a[29];this.e2_count=a[30];this.asp_registers=a[31];this.mpu_read_buffer_last_value=
|
|
85
|
-
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
|
|
86
|
-
return 255};D.prototype.port2x2_read=function(){B("222 read: advanced fm music status port (unimplemented)",8388608);return 255};D.prototype.port2x3_read=function(){B("223 read: advanced music data port (write only)",8388608);return 255};D.prototype.port2x4_read=function(){B("224 read: mixer address port",8388608);return this.mixer_current_address};D.prototype.port2x5_read=function(){B("225 read: mixer data port",8388608);return this.mixer_read(this.mixer_current_address)};
|
|
87
|
-
function(){B("226 read: (write only)",8388608);return 255};D.prototype.port2x7_read=function(){B("227 read: undocumented",8388608);return 255};D.prototype.port2x8_read=function(){B("228 read: fm music status port (unimplemented)",8388608);return 255};D.prototype.port2x9_read=function(){B("229 read: fm music data port (write only)",8388608);return 255};D.prototype.port2xA_read=function(){B("22A read: read data",8388608);this.read_buffer.length&&(this.read_buffer_lastvalue=
|
|
88
|
-
B(" <- "+this.read_buffer_lastvalue+" "+n(this.read_buffer_lastvalue)+" '"+String.fromCharCode(this.read_buffer_lastvalue)+"'",8388608);return this.read_buffer_lastvalue};D.prototype.port2xB_read=function(){B("22B read: undocumented",8388608);return 255};D.prototype.port2xC_read=function(){B("22C read: write-buffer status",8388608);return 127};D.prototype.port2xD_read=function(){B("22D read: undocumented",8388608);return 255};D.prototype.port2xE_read=function(){B("22E read: read-buffer status / irq 8bit ack.",
|
|
89
|
-
8388608);this.irq_triggered[1]&&this.lower_irq(1);return(this.read_buffer.length&&!this.dsp_highspeed)<<7|127};D.prototype.port2xF_read=function(){B("22F read: irq 16bit ack",8388608);this.lower_irq(2);return 0};D.prototype.port2x0_write=function(a){B("220 write: (unimplemented) fm register 0 address = "+n(a),8388608);this.fm_current_address0=0};D.prototype.port2x1_write=function(a){B("221 write: (unimplemented) fm register 0 data = "+n(a),8388608);var b=
|
|
90
|
-
b.call(this,a,0,this.fm_current_address0)};D.prototype.port2x2_write=function(a){B("222 write: (unimplemented) fm register 1 address = "+n(a),8388608);this.fm_current_address1=0};D.prototype.port2x3_write=function(a){B("223 write: (unimplemented) fm register 1 data ="+n(a),8388608);var b=
|
|
1
|
+
;let module = {exports:{}}; const aa=[[1,""],[2,"CPU"],[32768,"DISK"],[4,"FPU"],[8,"MEM"],[16,"DMA"],[32,"IO"],[64,"PS2"],[128,"PIC"],[256,"VGA"],[512,"PIT"],[1024,"MOUS"],[2048,"PCI"],[4096,"BIOS"],[8192,"FLOP"],[16384,"SERI"],[65536,"RTC"],[262144,"ACPI"],[524288,"APIC"],[1048576,"NET"],[2097152,"VIO"],[4194304,"9P"],[8388608,"SB16"],[16777216,"FETC"]];function ca(a,b){return(a||0===a?a+"":"").padEnd(b," ")}function da(a,b){return(a||0===a?a+"":"").padStart(b,"0")}function h(a,b,c,d){l(0<=c);return new Proxy({},{get:function(e,
|
|
2
|
+
f){e=new a(b.buffer,c,d);const g=e[f];if("function"===typeof g)return g.bind(e);l(/^\d+$/.test(f)||"buffer"===f||"length"===f||"BYTES_PER_ELEMENT"===f||"byteOffset"===f);return g},set:function(e,f,g){l(/^\d+$/.test(f));(new a(b.buffer,c,d))[f]=g;return!0}})}function n(a,b){a=a?a.toString(16):"";return"0x"+da(a.toUpperCase(),b||1)}var ea;if("undefined"!==typeof crypto&&crypto.getRandomValues){const a=new Int32Array(1);ea=function(){crypto.getRandomValues(a);return a[0]}}else if("undefined"!==typeof require){const a=
|
|
3
|
+
require("crypto");ea=function(){return a.randomBytes(4).readInt32LE(0)}}else"undefined"!==typeof process?import("node:crypto").then(a=>{ea=function(){return a.randomBytes(4).readInt32LE(0)}}):l(!1,"Unsupported platform: No cryptographic random values");var fa;if("function"===typeof Math.clz32)fa=function(a){l(0<a);return 31-Math.clz32(a)};else{for(var ha=new Int8Array(256),ia=0,ka=-2;256>ia;ia++)ia&ia-1||ka++,ha[ia]=ka;fa=function(a){a>>>=0;l(0<a);var b=a>>>16;if(b){var c=b>>>8;return c?24+ha[c]:
|
|
4
|
+
16+ha[b]}return(c=a>>>8)?8+ha[c]:ha[a]}}function ma(a){l(0<=a);return 1>=a?1:1<<1+fa(a-1)}l(0===fa(1));l(1===fa(2));l(2===fa(7));l(3===fa(8));l(26===fa(123456789));l(1===ma(0));l(1===ma(1));l(2===ma(2));l(8===ma(7));l(8===ma(8));l(134217728===ma(123456789));function na(a){var b=new Uint8Array(a),c,d;l(0===(a&a-1));this.length=0;this.push=function(e){this.length!==a&&this.length++;b[d]=e;d=d+1&a-1};this.shift=function(){if(this.length){var e=b[c];c=c+1&a-1;this.length--;return e}return-1};this.peek=
|
|
5
|
+
function(){return this.length?b[c]:-1};this.clear=function(){this.length=d=c=0};this.clear()}function oa(a){this.size=a;this.data=new Float32Array(a);this.length=this.end=this.start=0;l(0===(a&a-1))}oa.prototype.push=function(a){this.length===this.size?this.start=this.start+1&this.size-1:this.length++;this.data[this.end]=a;this.end=this.end+1&this.size-1};oa.prototype.shift=function(){if(this.length){var a=this.data[this.start];this.start=this.start+1&this.size-1;this.length--;return a}};oa.prototype.shift_block=
|
|
6
|
+
function(a){var b=new Float32Array(a);a>this.length&&(a=this.length);var c=this.start+a,d=this.data.subarray(this.start,c);b.set(d);c>=this.size&&(c-=this.size,b.set(this.data.subarray(0,c),d.length));this.start=c;this.length-=a;return b};oa.prototype.peek=function(){if(this.length)return this.data[this.start]};oa.prototype.clear=function(){this.length=this.end=this.start=0};function qa(a,b){Array.isArray(a)||(a=[a]);var c=new Blob(a);a=document.createElement("a");a.download=b;a.href=window.URL.createObjectURL(c);
|
|
7
|
+
a.dataset.downloadurl=["application/octet-stream",a.download,a.href].join(":");document.createEvent?(b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),a.dispatchEvent(b)):a.click();window.URL.revokeObjectURL(a.href)}function ra(a){"number"===typeof a?this.view=new Uint8Array(a+7>>3):a instanceof ArrayBuffer?this.view=new Uint8Array(a):l(!1,"Bitmap: Invalid argument")}ra.prototype.set=function(a,b){const c=a>>3;a=1<<(a&7);this.view[c]=b?this.view[c]|
|
|
8
|
+
a:this.view[c]&~a};ra.prototype.get=function(a){return this.view[a>>3]>>(a&7)&1};ra.prototype.get_buffer=function(){return this.view.buffer};var ta,ua;if("undefined"===typeof XMLHttpRequest||"undefined"!==typeof process&&process.versions&&process.versions.node){let a;ta=async function(b,c){a||(a=await import("node:fs/promises"));if(c.range){l(!c.as_json);b=await a.open(b,"r");const e=c.range.length,f=Buffer.allocUnsafe(e);try{var d=await b.read({buffer:f,position:c.range.start});l(d.bytesRead===e)}finally{await b.close()}c.done&&
|
|
9
|
+
c.done(new Uint8Array(f))}else d=await a.readFile(b,{encoding:c.as_json?"utf-8":null}),d=c.as_json?JSON.parse(d):(new Uint8Array(d)).buffer,c.done(d)};ua=async function(b){a||(a=await import("node:fs/promises"));return(await a.stat(b)).size}}else ta=async function(a,b,c){function d(){const m=c||0;setTimeout(()=>{ta(a,b,m+1)},1E3*([1,1,2,3,5,8,13,21][m]||34))}var e=new XMLHttpRequest;e.open(b.method||"get",a,!0);e.responseType=b.as_json?"json":"arraybuffer";if(b.headers)for(var f=Object.keys(b.headers),
|
|
10
|
+
g=0;g<f.length;g++){var k=f[g];e.setRequestHeader(k,b.headers[k])}b.range&&(f=b.range.start,e.setRequestHeader("Range","bytes="+f+"-"+(f+b.range.length-1)),e.setRequestHeader("X-Accept-Encoding","identity"),e.onreadystatechange=function(){200===e.status&&(console.error("Server sent full file in response to ranged request, aborting",{filename:a}),e.abort())});e.onload=function(){if(4===e.readyState)if(200!==e.status&&206!==e.status)console.error("Loading the image "+a+" failed (status %d)",e.status),
|
|
11
|
+
500<=e.status&&600>e.status&&d();else if(e.response){if(b.range){const m=e.getResponseHeader("Content-Encoding");m&&"identity"!==m&&console.error("Server sent Content-Encoding in response to ranged request",{filename:a,enc:m})}b.done&&b.done(e.response,e)}};e.onerror=function(m){console.error("Loading the image "+a+" failed",m);d()};b.progress&&(e.onprogress=function(m){b.progress(m)});e.send(null)},ua=async function(a){return new Promise((b,c)=>{ta(a,{done:(d,e)=>{d=e.getResponseHeader("Content-Range")||
|
|
12
|
+
"";(e=d.match(/\/(\d+)\s*$/))?b(+e[1]):c(Error("`Range: bytes=...` header not supported (Got `"+d+"`)"))},headers:{Range:"bytes=0-0","X-Accept-Encoding":"identity"}})})};function va(a,b,c){return String.fromCharCode(...(new Uint8Array(a.buffer,b>>>0,c>>>0)))}var xa=-15786961;const B=function(){const a=aa.reduce(function(d,e){d[e[0]]=e[1];return d},{});var b="",c=0;return function(d,e){e=e||1;if(e&xa){d="["+ca(a[e]||"",4)+"] "+d;if(d===b&&(c++,2048>c))return;e=new Date;e=da(e.getHours(),2)+":"+da(e.getMinutes(),
|
|
13
|
+
2)+":"+da(e.getSeconds(),2)+"+"+da(e.getMilliseconds(),3)+" ";c&&(1===c?console.log(e+b):console.log("Previous message repeated "+c+" times"),c=0);console.log(e+d);b=d}}}();function l(a,b){if(!a){debugger;console.trace();if(b)throw"Assert failed: "+b;throw"Assert failed";}}function ya(a,b){function c(y){y=y.toString(16);return"#"+"0".repeat(6-y.length)+y}function d(y){var w=256*pa,G=8*T,M=Va?Va.canvas:null;M&&M.width===w&&M.height===G||(M?(M.width=w,M.height=G):(M=new OffscreenCanvas(w,G),Va=M.getContext("2d")),
|
|
14
|
+
Kb=Va.createImageData(w,G));const S=Kb.data;let R=0,U;G=Lb?function(ba){U=U||ba;S[R+3]=ba;S[R+7]=ba;R+=8}:function(ba){U=U||ba;S[R+3]=ba;R+=4};M=32-T;const la=w*(T-1)*4;w=4*(pa-w*T);const ja=1020*pa;for(let ba=0,sa=0;2048>ba;++ba,sa+=M,R+=w){const Ha=ba%256;ba&&!Ha&&(R+=la);U=!1;for(let Ma=0;Ma<T;++Ma,++sa,R+=ja){const Na=y[sa];for(let wa=128;0<wa;wa>>=1)G(Na&wa?255:0);Mb&&G(Nb&&192<=Ha&&223>=Ha&&Na&1?255:0)}fc[ba]=U?1:0}Va.putImageData(Kb,0,0)}function e(y,w,G,M){if(w&&G){y.style.width="";y.style.height=
|
|
15
|
+
"";M&&(y.style.transform="");var S=y.getBoundingClientRect();M?y.style.transform=(1===w?"":" scaleX("+w+")")+(1===G?"":" scaleY("+G+")"):(0===w%1&&0===G%1?(g.style.imageRendering="crisp-edges",g.style.imageRendering="pixelated",g.style["-ms-interpolation-mode"]="nearest-neighbor"):(g.style.imageRendering="",g.style["-ms-interpolation-mode"]=""),M=window.devicePixelRatio||1,0!==M%1&&(w/=M,G/=M));1!==w&&(y.style.width=S.width*w+"px");1!==G&&(y.style.height=S.height*G+"px")}}const f=a.container;this.screen_fill_buffer=
|
|
16
|
+
b;console.assert(f,"options.container must be provided");this.FLAG_BLINKING=1;this.FLAG_FONT_PAGE_B=2;var g=f.getElementsByTagName("canvas")[0],k=g.getContext("2d",{alpha:!1}),m=f.getElementsByTagName("div")[0],p=document.createElement("div"),q,r,v=void 0!==a.scale?a.scale:1,t=void 0!==a.scale?a.scale:1,z=1,A,u,E,F,x,N,V,Va,Kb,fc=new Int8Array(2048),T,pa,Mb,Lb,Nb,Ob=0,Pb=0,sb,gc=0,tb,Qb,ub,Rb=[],ib=Rb,vb=0,Sb=!1;this.init=function(){const y=new Uint16Array([32,9786,9787,9829,9830,9827,9824,8226,9688,
|
|
17
|
+
9675,9689,9794,9792,9834,9835,9788,9658,9668,8597,8252,182,167,9644,8616,8593,8595,8594,8592,8735,8596,9650,9660]),w=new Uint16Array([8962,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,
|
|
18
|
+
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 G=0,M;256>G;G++)M=126<G?w[G-127]:32>G?y[G]:G,Rb.push(String.fromCharCode(M));p.classList.add("cursor");p.style.position="absolute";p.style.backgroundColor="#ccc";p.style.width="7px";p.style.display="inline-block";this.set_mode(!1);this.set_size_text(80,25);2===u&&this.set_size_graphical(720,
|
|
19
|
+
400,720,400);this.set_scale(v,t);this.timer()};this.make_screenshot=function(){const y=new Image;if(1===u||2===u)y.src=g.toDataURL("image/png");else{const w=[9,16],G=document.createElement("canvas");G.width=F*w[0];G.height=x*w[1];const M=G.getContext("2d");M.imageSmoothingEnabled=!1;M.font=window.getComputedStyle(m).font;M.textBaseline="top";for(let S=0;S<x;S++)for(let R=0;R<F;R++){const U=4*(S*F+R),la=E[U+0],ja=E[U+3];M.fillStyle=c(E[U+2]);M.fillRect(R*w[0],S*w[1],w[0],w[1]);M.fillStyle=c(ja);M.fillText(ib[la],
|
|
20
|
+
R*w[0],S*w[1])}"none"!==p.style.display&&q<x&&r<F&&(M.fillStyle=p.style.backgroundColor,M.fillRect(r*w[0],q*w[1]+parseInt(p.style.marginTop,10),parseInt(p.style.width,10),parseInt(p.style.height,10)));y.src=G.toDataURL("image/png")}return y};this.put_char=function(y,w,G,M,S,R){l(0<=y&&y<x);l(0<=w&&w<F);l(0<=G&&256>G);w=4*(y*F+w);E[w+0]=G;E[w+1]=M;E[w+2]=S;E[w+3]=R;A[y]=1};this.timer=function(){vb=requestAnimationFrame(()=>this.update_screen())};this.update_screen=function(){Sb||(0===u?this.update_text():
|
|
21
|
+
1===u?this.update_graphical():this.update_graphical_text());this.timer()};this.update_text=function(){for(var y=0;y<x;y++)A[y]&&(this.text_update_row(y),A[y]=0)};this.update_graphical=function(){this.screen_fill_buffer()};this.update_graphical_text=function(){if(N){var y=performance.now();if(266<y-gc){sb=!sb;ub&&(A[q]=1);var w=4*F;for(let la=0,ja=0;la<x;++la)if(A[la])ja+=w;else for(var G=0;G<F;++G,ja+=4)if(E[ja+1]&1){A[la]=1;ja+=w-4*G;break}gc=y}y=Va.canvas;w=V.canvas;G=4*F;const S=F*pa,R=T;let U=
|
|
22
|
+
0;for(let la=0,ja=0,ba=0;la<x;++la,ja+=T){if(!A[la]){ba+=G;continue}++U;V.clearRect(0,R,S,T);let sa,Ha,Ma,Na;for(let wa=0;wa<S;wa+=pa,ba+=4){const hc=E[ba+0];var M=E[ba+1];const ic=E[ba+2],jc=E[ba+3],kc=M&2?Pb:Ob;M=(!(M&1)||sb)&&fc[(kc<<8)+hc];Ma!==ic&&(void 0!==Ma&&(N.fillStyle=c(Ma),N.fillRect(Na,ja,wa-Na,T)),Ma=ic,Na=wa);sa!==jc&&(void 0!==sa&&(V.fillStyle=c(sa),V.fillRect(Ha,0,wa-Ha,T)),sa=jc,Ha=wa);M&&V.drawImage(y,hc*pa,kc*T,pa,T,wa,R,pa,T)}V.fillStyle=c(sa);V.fillRect(Ha,0,S-Ha,T);V.globalCompositeOperation=
|
|
23
|
+
"destination-in";V.drawImage(w,0,R,S,T,0,0,S,T);V.globalCompositeOperation="source-over";N.fillStyle=c(Ma);N.fillRect(Na,ja,S-Na,T);N.drawImage(w,0,0,S,T,0,ja,S,T)}U&&(sb&&ub&&A[q]&&(N.fillStyle=c(E[4*(q*F+r)+3]),N.fillRect(r*pa,q*T+tb,pa,Qb-tb+1)),A.fill(0));U&&k.drawImage(N.canvas,0,0)}};this.destroy=function(){vb&&(cancelAnimationFrame(vb),vb=0)};this.pause=function(){Sb=!0;p.classList.remove("blinking-cursor")};this.continue=function(){Sb=!1;p.classList.add("blinking-cursor")};this.set_mode=function(y){u=
|
|
24
|
+
y?1:a.use_graphical_text?2:0;0===u?(m.style.display="block",g.style.display="none"):(m.style.display="none",g.style.display="block",2===u&&A&&A.fill(1))};this.set_font_bitmap=function(y,w,G,M,S,R){const U=G?16:w?9:8;if(T!==y||pa!==U||Mb!==w||Lb!==G||Nb!==M||R)R=pa!==U||T!==y,T=y,pa=U,Mb=w,Lb=G,Nb=M,2===u&&(d(S),A.fill(1),R&&this.set_size_graphical_text())};this.set_font_page=function(y,w){if(Ob!==y||Pb!==w)Ob=y,Pb=w,A.fill(1)};this.clear_screen=function(){k.fillStyle="#000";k.fillRect(0,0,g.width,
|
|
25
|
+
g.height)};this.set_size_graphical_text=function(){if(Va){var y=pa*F,w=T*x,G=2*T;N&&N.canvas.width===y&&N.canvas.height===w&&V.canvas.height===G||(N?(N.canvas.width=y,N.canvas.height=w,V.canvas.width=y,V.canvas.height=G):(N=(new OffscreenCanvas(y,w)).getContext("2d",{alpha:!1}),V=(new OffscreenCanvas(y,G)).getContext("2d")),this.set_size_graphical(y,w,y,w),A.fill(1))}};this.set_size_text=function(y,w){if(y!==F||w!==x)if(A=new Int8Array(w),E=new Int32Array(y*w*4),F=y,x=w,0===u){for(;m.childNodes.length>
|
|
26
|
+
w;)m.removeChild(m.firstChild);for(;m.childNodes.length<w;)m.appendChild(document.createElement("div"));for(y=0;y<w;y++)this.text_update_row(y);e(m,v,t,!0)}else 2===u&&this.set_size_graphical_text()};this.set_size_graphical=function(y,w){g.style.display="block";g.width=y;g.height=w;k.imageSmoothingEnabled=!1;z=640>=y&&2*y<window.innerWidth*window.devicePixelRatio&&2*w<window.innerHeight*window.devicePixelRatio?2:1;e(g,v*z,t*z,!1)};this.set_charmap=function(y){ib=y||Rb};this.set_scale=function(y,w){v=
|
|
27
|
+
y;t=w;e(m,v,t,!0);e(g,v*z,t*z,!1)};this.update_cursor_scanline=function(y,w,G){if(y!==tb||w!==Qb||G!==ub)0===u?G?(p.style.display="inline",p.style.height=w-y+"px",p.style.marginTop=y+"px"):p.style.display="none":2===u&&q<x&&(A[q]=1),tb=y,Qb=w,ub=G};this.update_cursor=function(y,w){if(y!==q||w!==r)y<x&&(A[y]=1),q<x&&(A[q]=1),q=y,r=w};this.text_update_row=function(y){var w=4*y*F,G;var M=m.childNodes[y];var S=document.createElement("div");for(var R=0;R<F;){var U=document.createElement("span");var la=
|
|
28
|
+
E[w+1]&1;var ja=E[w+2];var ba=E[w+3];la&&U.classList.add("blink");U.style.backgroundColor=c(ja);U.style.color=c(ba);for(G="";R<F&&(E[w+1]&1)===la&&E[w+2]===ja&&E[w+3]===ba;){var sa=E[w+0];G+=ib[sa];l(ib[sa]);R++;w+=4;if(y===q)if(R===r)break;else if(R===r+1){p.style.backgroundColor=U.style.color;S.appendChild(p);break}}U.textContent=G;S.appendChild(U)}M.parentNode.replaceChild(S,M)};this.update_buffer=function(y){for(const w of y)k.putImageData(w.image_data,w.screen_x-w.buffer_x,w.screen_y-w.buffer_y,
|
|
29
|
+
w.buffer_x,w.buffer_y,w.buffer_width,w.buffer_height)};this.get_text_screen=function(){for(var y=[],w=0;w<x;w++)y.push(this.get_text_row(w));return y};this.get_text_row=function(y){let w="";for(let G=0;G<F;G++)w+=ib[E[4*(y*F+G)]];return w};this.init()}function za(a){l(a instanceof ArrayBuffer);this.buffer=a;this.byteLength=a.byteLength;this.onprogress=this.onload=void 0}za.prototype.load=function(){this.onload&&this.onload({buffer:this.buffer})};za.prototype.get=function(a,b,c){l(a+b<=this.byteLength);
|
|
30
|
+
c(new Uint8Array(this.buffer,a,b))};za.prototype.set=function(a,b,c){l(a+b.byteLength<=this.byteLength);(new Uint8Array(this.buffer,a,b.byteLength)).set(b);c()};za.prototype.get_buffer=function(a){a(this.buffer)};za.prototype.get_state=function(){const a=[];a[0]=this.byteLength;a[1]=new Uint8Array(this.buffer);return a};za.prototype.set_state=function(a){this.byteLength=a[0];this.buffer=a[1].slice().buffer};function Aa(a,b,c){this.filename=a;this.byteLength=b;this.block_cache=new Map;this.block_cache_is_write=
|
|
31
|
+
new Set;this.fixed_chunk_size=c;this.cache_reads=!!c;this.onprogress=this.onload=void 0}Aa.prototype.load=async function(){void 0===this.byteLength&&(this.byteLength=await ua(this.filename));this.onload&&this.onload(Object.create(null))};Aa.prototype.get_from_cache=function(a,b){var c=b/256;a/=256;for(var d=0;d<c;d++)if(!this.block_cache.get(a+d))return;if(1===c)return this.block_cache.get(a);b=new Uint8Array(b);for(d=0;d<c;d++)b.set(this.block_cache.get(a+d),256*d);return b};Aa.prototype.get=function(a,
|
|
32
|
+
b,c){l(a+b<=this.byteLength);l(0===a%256);l(0===b%256);l(b);var d=this.get_from_cache(a,b);if(d)c(d);else{var e=a,f=b;this.fixed_chunk_size&&(e=a-a%this.fixed_chunk_size,f=Math.ceil((a-e+b)/this.fixed_chunk_size)*this.fixed_chunk_size);ta(this.filename,{done:function(g){g=new Uint8Array(g);this.handle_read(e,f,g);e===a&&f===b?c(g):c(g.subarray(a-e,a-e+b))}.bind(this),range:{start:e,length:f}})}};Aa.prototype.set=function(a,b,c){var d=b.length;l(a+b.byteLength<=this.byteLength);l(0===a%256);l(0===
|
|
33
|
+
d%256);l(d);a/=256;d/=256;for(var e=0;e<d;e++){var f=this.block_cache.get(a+e);if(void 0===f)f=b.slice(256*e,256*(e+1)),this.block_cache.set(a+e,f);else{const g=b.subarray(256*e,256*(e+1));l(f.byteLength===g.length);f.set(g)}this.block_cache_is_write.add(a+e)}c()};Aa.prototype.handle_read=function(a,b,c){a/=256;b/=256;for(var d=0;d<b;d++){const e=this.block_cache.get(a+d);e?c.set(e,256*d):this.cache_reads&&this.block_cache.set(a+d,c.slice(256*d,256*(d+1)))}};Aa.prototype.get_buffer=function(a){a()};
|
|
34
|
+
Aa.prototype.get_state=function(){const a=[],b=[];for(const [c,d]of this.block_cache)l(isFinite(c)),this.block_cache_is_write.has(c)&&b.push([c,d]);a[0]=b;return a};Aa.prototype.set_state=function(a){a=a[0];this.block_cache.clear();this.block_cache_is_write.clear();for(const [b,c]of a)l(isFinite(b)),this.block_cache.set(b,c),this.block_cache_is_write.add(b)};function Ba(a,b,c,d,e){const f=a.match(/\.[^\.]+(\.zst)?$/);this.extension=f?f[0]:"";this.basename=a.substring(0,a.length-this.extension.length);
|
|
35
|
+
this.is_zstd=this.extension.endsWith(".zst");this.basename.endsWith("/")||(this.basename+="-");this.block_cache=new Map;this.block_cache_is_write=new Set;this.byteLength=b;this.fixed_chunk_size=c;this.partfile_alt_format=!!d;this.zstd_decompress=e;this.cache_reads=!!c;this.onprogress=this.onload=void 0}Ba.prototype.load=function(){void 0===this.byteLength&&l(!1);this.onload&&this.onload(Object.create(null))};Ba.prototype.get=function(a,b,c){l(a+b<=this.byteLength);l(0===a%256);l(0===b%256);l(b);var d=
|
|
36
|
+
this.get_from_cache(a,b);if(d)c(d);else if(this.fixed_chunk_size){const f=Math.floor(a/this.fixed_chunk_size),g=a-f*this.fixed_chunk_size;l(0<=g);const k=Math.ceil((g+b)/this.fixed_chunk_size),m=new Uint8Array(k*this.fixed_chunk_size);let p=0;for(let q=0;q<k;q++){var e=(f+q)*this.fixed_chunk_size;d=this.partfile_alt_format?this.basename+(f+q+"").padStart(8,"0")+this.extension:this.basename+e+"-"+(e+this.fixed_chunk_size)+this.extension;(e=this.get_from_cache(e,this.fixed_chunk_size))?(m.set(e,q*this.fixed_chunk_size),
|
|
37
|
+
p++,p===k&&c(m.subarray(g,g+b))):ta(d,{done:async function(r){r=new Uint8Array(r);this.is_zstd&&(r=await this.zstd_decompress(this.fixed_chunk_size,r),r=new Uint8Array(r));m.set(r,q*this.fixed_chunk_size);this.handle_read((f+q)*this.fixed_chunk_size,this.fixed_chunk_size|0,r);p++;p===k&&c(m.subarray(g,g+b))}.bind(this)})}}else ta(this.basename+a+"-"+(a+b)+this.extension,{done:function(f){l(f.byteLength===b);f=new Uint8Array(f);this.handle_read(a,b,f);c(f)}.bind(this)})};Ba.prototype.get_from_cache=
|
|
38
|
+
Aa.prototype.get_from_cache;Ba.prototype.set=Aa.prototype.set;Ba.prototype.handle_read=Aa.prototype.handle_read;Ba.prototype.get_state=Aa.prototype.get_state;Ba.prototype.set_state=Aa.prototype.set_state;function Ca(a){this.file=a;this.byteLength=a.size;1073741824<a.size&&console.warn("SyncFileBuffer: Allocating buffer of "+(a.size>>20)+" MB ...");this.buffer=new ArrayBuffer(a.size);this.onprogress=this.onload=void 0}Ca.prototype.load=function(){this.load_next(0)};Ca.prototype.load_next=function(a){var b=
|
|
39
|
+
new FileReader;b.onload=function(d){d=new Uint8Array(d.target.result);(new Uint8Array(this.buffer,a)).set(d);this.load_next(a+4194304)}.bind(this);if(this.onprogress)this.onprogress({loaded:a,total:this.byteLength,lengthComputable:!0});if(a<this.byteLength){var c=this.file.slice(a,Math.min(a+4194304,this.byteLength));b.readAsArrayBuffer(c)}else this.file=void 0,this.onload&&this.onload({buffer:this.buffer})};Ca.prototype.get=za.prototype.get;Ca.prototype.set=za.prototype.set;Ca.prototype.get_buffer=
|
|
40
|
+
za.prototype.get_buffer;Ca.prototype.get_state=za.prototype.get_state;Ca.prototype.set_state=za.prototype.set_state;function Da(a){this.file=a;this.byteLength=a.size;this.block_cache=new Map;this.block_cache_is_write=new Set;this.onprogress=this.onload=void 0}Da.prototype.load=function(){this.onload&&this.onload(Object.create(null))};Da.prototype.get=function(a,b,c){l(0===a%256);l(0===b%256);l(b);var d=this.get_from_cache(a,b);d?c(d):(d=new FileReader,d.onload=function(e){e=new Uint8Array(e.target.result);
|
|
41
|
+
this.handle_read(a,b,e);c(e)}.bind(this),d.readAsArrayBuffer(this.file.slice(a,a+b)))};Da.prototype.get_from_cache=Aa.prototype.get_from_cache;Da.prototype.set=Aa.prototype.set;Da.prototype.handle_read=Aa.prototype.handle_read;Da.prototype.get_state=Aa.prototype.get_state;Da.prototype.set_state=Aa.prototype.set_state;Da.prototype.get_buffer=function(a){a()};Da.prototype.get_as_file=function(a){for(var b=[],c=Array.from(this.block_cache.keys()).sort(function(k,m){return k-m}),d=0,e=0;e<c.length;e++){var f=
|
|
42
|
+
c[e],g=this.block_cache.get(f);f*=256;l(f>=d);f!==d&&(b.push(this.file.slice(d,f)),d=f);b.push(g);d+=g.length}d!==this.file.size&&b.push(this.file.slice(d));a=new File(b,a);l(a.size===this.file.size);return a};function Ea(a,b){if(a.buffer instanceof ArrayBuffer)return new za(a.buffer);if("undefined"!==typeof File&&a.buffer instanceof File)return b=a.async,void 0===b&&(b=268435456<=a.buffer.size),b?new Da(a.buffer):new Ca(a.buffer);if(a.url)return a.use_parts?new Ba(a.url,a.size,a.fixed_chunk_size,
|
|
43
|
+
!1,b):new Aa(a.url,a.size,a.fixed_chunk_size);B("Ignored file: url="+a.url+" buffer="+a.buffer)}function C(a){this.cpu=a;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;a=a.io;a.register_write(0,
|
|
44
|
+
this,this.port_addr_write.bind(this,0));a.register_write(2,this,this.port_addr_write.bind(this,1));a.register_write(4,this,this.port_addr_write.bind(this,2));a.register_write(6,this,this.port_addr_write.bind(this,3));a.register_write(1,this,this.port_count_write.bind(this,0));a.register_write(3,this,this.port_count_write.bind(this,1));a.register_write(5,this,this.port_count_write.bind(this,2));a.register_write(7,this,this.port_count_write.bind(this,3));a.register_read(0,this,this.port_addr_read.bind(this,
|
|
45
|
+
0));a.register_read(2,this,this.port_addr_read.bind(this,1));a.register_read(4,this,this.port_addr_read.bind(this,2));a.register_read(6,this,this.port_addr_read.bind(this,3));a.register_read(1,this,this.port_count_read.bind(this,0));a.register_read(3,this,this.port_count_read.bind(this,1));a.register_read(5,this,this.port_count_read.bind(this,2));a.register_read(7,this,this.port_count_read.bind(this,3));a.register_write(192,this,this.port_addr_write.bind(this,4));a.register_write(196,this,this.port_addr_write.bind(this,
|
|
46
|
+
5));a.register_write(200,this,this.port_addr_write.bind(this,6));a.register_write(204,this,this.port_addr_write.bind(this,7));a.register_write(194,this,this.port_count_write.bind(this,4));a.register_write(198,this,this.port_count_write.bind(this,5));a.register_write(202,this,this.port_count_write.bind(this,6));a.register_write(206,this,this.port_count_write.bind(this,7));a.register_read(192,this,this.port_addr_read.bind(this,4));a.register_read(196,this,this.port_addr_read.bind(this,5));a.register_read(200,
|
|
47
|
+
this,this.port_addr_read.bind(this,6));a.register_read(204,this,this.port_addr_read.bind(this,7));a.register_read(194,this,this.port_count_read.bind(this,4));a.register_read(198,this,this.port_count_read.bind(this,5));a.register_read(202,this,this.port_count_read.bind(this,6));a.register_read(206,this,this.port_count_read.bind(this,7));a.register_write(135,this,this.port_page_write.bind(this,0));a.register_write(131,this,this.port_page_write.bind(this,1));a.register_write(129,this,this.port_page_write.bind(this,
|
|
48
|
+
2));a.register_write(130,this,this.port_page_write.bind(this,3));a.register_write(143,this,this.port_page_write.bind(this,4));a.register_write(139,this,this.port_page_write.bind(this,5));a.register_write(137,this,this.port_page_write.bind(this,6));a.register_write(138,this,this.port_page_write.bind(this,7));a.register_read(135,this,this.port_page_read.bind(this,0));a.register_read(131,this,this.port_page_read.bind(this,1));a.register_read(129,this,this.port_page_read.bind(this,2));a.register_read(130,
|
|
49
|
+
this,this.port_page_read.bind(this,3));a.register_read(143,this,this.port_page_read.bind(this,4));a.register_read(139,this,this.port_page_read.bind(this,5));a.register_read(137,this,this.port_page_read.bind(this,6));a.register_read(138,this,this.port_page_read.bind(this,7));a.register_write(1159,this,this.port_pagehi_write.bind(this,0));a.register_write(1155,this,this.port_pagehi_write.bind(this,1));a.register_write(1153,this,this.port_pagehi_write.bind(this,2));a.register_write(1154,this,this.port_pagehi_write.bind(this,
|
|
50
|
+
3));a.register_write(1163,this,this.port_pagehi_write.bind(this,5));a.register_write(1161,this,this.port_pagehi_write.bind(this,6));a.register_write(1162,this,this.port_pagehi_write.bind(this,7));a.register_read(1159,this,this.port_pagehi_read.bind(this,0));a.register_read(1155,this,this.port_pagehi_read.bind(this,1));a.register_read(1153,this,this.port_pagehi_read.bind(this,2));a.register_read(1154,this,this.port_pagehi_read.bind(this,3));a.register_read(1163,this,this.port_pagehi_read.bind(this,
|
|
51
|
+
5));a.register_read(1161,this,this.port_pagehi_read.bind(this,6));a.register_read(1162,this,this.port_pagehi_read.bind(this,7));a.register_write(10,this,this.port_singlemask_write.bind(this,0));a.register_write(212,this,this.port_singlemask_write.bind(this,4));a.register_write(15,this,this.port_multimask_write.bind(this,0));a.register_write(222,this,this.port_multimask_write.bind(this,4));a.register_read(15,this,this.port_multimask_read.bind(this,0));a.register_read(222,this,this.port_multimask_read.bind(this,
|
|
52
|
+
4));a.register_write(11,this,this.port_mode_write.bind(this,0));a.register_write(214,this,this.port_mode_write.bind(this,4));a.register_write(12,this,this.portC_write);a.register_write(216,this,this.portC_write)}C.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]};C.prototype.set_state=function(a){this.channel_page=a[0];this.channel_pagehi=
|
|
53
|
+
a[1];this.channel_addr=a[2];this.channel_addr_init=a[3];this.channel_count=a[4];this.channel_count_init=a[5];this.channel_mask=a[6];this.channel_mode=a[7];this.lsb_msb_flipflop=a[8]};C.prototype.port_count_write=function(a,b){B("count write ["+a+"] = "+n(b),16);this.channel_count[a]=this.flipflop_get(this.channel_count[a],b,!1);this.channel_count_init[a]=this.flipflop_get(this.channel_count_init[a],b,!0)};C.prototype.port_count_read=function(a){B("count read ["+a+"] -> "+n(this.channel_count[a]),
|
|
54
|
+
16);return this.flipflop_read(this.channel_count[a])};C.prototype.port_addr_write=function(a,b){B("addr write ["+a+"] = "+n(b),16);this.channel_addr[a]=this.flipflop_get(this.channel_addr[a],b,!1);this.channel_addr_init[a]=this.flipflop_get(this.channel_addr_init[a],b,!0)};C.prototype.port_addr_read=function(a){B("addr read ["+a+"] -> "+n(this.channel_addr[a]),16);return this.flipflop_read(this.channel_addr[a])};C.prototype.port_pagehi_write=function(a,b){B("pagehi write ["+a+"] = "+n(b),16);this.channel_pagehi[a]=
|
|
55
|
+
b};C.prototype.port_pagehi_read=function(a){B("pagehi read ["+a+"]",16);return this.channel_pagehi[a]};C.prototype.port_page_write=function(a,b){B("page write ["+a+"] = "+n(b),16);this.channel_page[a]=b};C.prototype.port_page_read=function(a){B("page read ["+a+"]",16);return this.channel_page[a]};C.prototype.port_singlemask_write=function(a,b){a=(b&3)+a;b=b&4?1:0;B("singlechannel mask write ["+a+"] = "+b,16);this.update_mask(a,b)};C.prototype.port_multimask_write=function(a,b){B("multichannel mask write: "+
|
|
56
|
+
n(b),16);for(var c=0;4>c;c++)this.update_mask(a+c,b&1<<c)};C.prototype.port_multimask_read=function(a){var b=0|this.channel_mask[a+0];b|=this.channel_mask[a+1]<<1;b|=this.channel_mask[a+2]<<2;b|=this.channel_mask[a+3]<<3;B("multichannel mask read: "+n(b),16);return b};C.prototype.port_mode_write=function(a,b){a=(b&3)+a;B("mode write ["+a+"] = "+n(b),16);this.channel_mode[a]=b};C.prototype.portC_write=function(){B("flipflop reset",16);this.lsb_msb_flipflop=0};C.prototype.on_unmask=function(a,b){this.unmask_listeners.push({fn:a,
|
|
57
|
+
this_value:b})};C.prototype.update_mask=function(a,b){if(this.channel_mask[a]!==b&&(this.channel_mask[a]=b,!b))for(B("firing on_unmask("+a+")",16),b=0;b<this.unmask_listeners.length;b++)this.unmask_listeners[b].fn.call(this.unmask_listeners[b].this_value,a)};C.prototype.do_read=function(a,b,c,d,e){var f=this.count_get_8bit(d),g=this.address_get_8bit(d);B("DMA write channel "+d,16);B("to "+n(g)+" len "+n(f),16);c<f&&B("DMA should read more than provided: "+n(c)+" "+n(f),16);if(b+f>a.byteLength)B("DMA read outside of buffer",
|
|
58
|
+
16),e(!0);else{var k=this.cpu;this.channel_addr[d]+=f;a.get(b,f,function(m){k.write_blob(m,g);e(!1)})}};C.prototype.do_write=function(a,b,c,d,e){var f=this.channel_count[d]+1&65535,g=5<=d?2:1,k=f*g,m=this.address_get_8bit(d),p=!1,q=!1,r=this.channel_mode[d]&16;B("DMA write channel "+d,16);B("to "+n(m)+" len "+n(k),16);c<k?(B("DMA should read more than provided",16),f=Math.floor(c/g),k=f*g,p=!0):c>k&&(B("DMA attempted to read more than provided",16),q=!0);b+k>a.byteLength?(B("DMA write outside of buffer",
|
|
59
|
+
16),e(!0)):(this.channel_addr[d]+=f,this.channel_count[d]-=f,!p&&r&&(B("DMA autoinit",16),this.channel_addr[d]=this.channel_addr_init[d],this.channel_count[d]=this.channel_count_init[d]),a.set(b,this.cpu.mem8.subarray(m,m+k),()=>{q&&r?(B("DMA continuing from start",16),this.do_write(a,b+k,c-k,d,e)):e(!1)}))};C.prototype.address_get_8bit=function(a){var b=this.channel_addr[a];5<=a&&(b<<=1);b=b&65535|this.channel_page[a]<<16;return b|=this.channel_pagehi[a]<<24};C.prototype.count_get_8bit=function(a){var b=
|
|
60
|
+
this.channel_count[a]+1;5<=a&&(b*=2);return b};C.prototype.flipflop_get=function(a,b,c){c||(this.lsb_msb_flipflop^=1);return this.lsb_msb_flipflop?a&-256|b:a&-65281|b<<8};C.prototype.flipflop_read=function(a){return(this.lsb_msb_flipflop^=1)?a&255:a>>8&255};function Fa(a){this.ports=[];this.cpu=a;for(var b=0;65536>b;b++)this.ports[b]=this.create_empty_entry();var c=a.memory_size[0];for(b=0;b<<17<c;b++)a.memory_map_read8[b]=a.memory_map_write8[b]=void 0,a.memory_map_read32[b]=a.memory_map_write32[b]=
|
|
61
|
+
void 0;this.mmap_register(c,4294967296-c,function(d){B("Read from unmapped memory space, addr="+n(d>>>0,8),32);return 255},function(d,e){B("Write to unmapped memory space, addr="+n(d>>>0,8)+" value="+n(e,2),32)},function(d){B("Read from unmapped memory space, addr="+n(d>>>0,8),32);return-1},function(d,e){B("Write to unmapped memory space, addr="+n(d>>>0,8)+" value="+n(e>>>0,8),32)})}Fa.prototype.create_empty_entry=function(){return{read8:this.empty_port_read8,read16:this.empty_port_read16,read32:this.empty_port_read32,
|
|
62
|
+
write8:this.empty_port_write,write16:this.empty_port_write,write32:this.empty_port_write,device:void 0}};Fa.prototype.empty_port_read8=function(){return 255};Fa.prototype.empty_port_read16=function(){return 65535};Fa.prototype.empty_port_read32=function(){return-1};Fa.prototype.empty_port_write=function(){};Fa.prototype.register_read=function(a,b,c,d,e){function f(g){l(!1,"Overlapped read"+g+" "+n(a,4)+" ("+b.name+")");return-1>>>32-g|0}l("number"===typeof a);l("object"===typeof b);l(!c||"function"===
|
|
63
|
+
typeof c);l(!d||"function"===typeof d);l(!e||"function"===typeof e);l(c||d||e);c||(c=f.bind(this,8));d||(d=f.bind(this,16));e||(e=f.bind(this,32));c&&(this.ports[a].read8=c);d&&(this.ports[a].read16=d);e&&(this.ports[a].read32=e);this.ports[a].device=b};Fa.prototype.register_write=function(a,b,c,d,e){function f(g){l(!1,"Overlapped write"+g+" "+n(a)+" ("+b.name+")")}l("number"===typeof a);l("object"===typeof b);l(!c||"function"===typeof c);l(!d||"function"===typeof d);l(!e||"function"===typeof e);
|
|
64
|
+
l(c||d||e);c||(c=f.bind(this,8));d||(d=f.bind(this,16));e||(e=f.bind(this,32));c&&(this.ports[a].write8=c);d&&(this.ports[a].write16=d);e&&(this.ports[a].write32=e);this.ports[a].device=b};Fa.prototype.register_read_consecutive=function(a,b,c,d,e,f){function g(){return c.call(this)|d.call(this)<<8}function k(){return e.call(this)|f.call(this)<<8}function m(){return c.call(this)|d.call(this)<<8|e.call(this)<<16|f.call(this)<<24}l(4===arguments.length||6===arguments.length);e&&f?(this.register_read(a,
|
|
65
|
+
b,c,g,m),this.register_read(a+1,b,d),this.register_read(a+2,b,e,k),this.register_read(a+3,b,f)):(this.register_read(a,b,c,g),this.register_read(a+1,b,d))};Fa.prototype.register_write_consecutive=function(a,b,c,d,e,f){function g(p){c.call(this,p&255);d.call(this,p>>8&255)}function k(p){e.call(this,p&255);f.call(this,p>>8&255)}function m(p){c.call(this,p&255);d.call(this,p>>8&255);e.call(this,p>>16&255);f.call(this,p>>>24)}l(4===arguments.length||6===arguments.length);e&&f?(this.register_write(a,b,
|
|
66
|
+
c,g,m),this.register_write(a+1,b,d),this.register_write(a+2,b,e,k),this.register_write(a+3,b,f)):(this.register_write(a,b,c,g),this.register_write(a+1,b,d))};Fa.prototype.mmap_read32_shim=function(a){var b=this.cpu.memory_map_read8[a>>>17];return b(a)|b(a+1)<<8|b(a+2)<<16|b(a+3)<<24};Fa.prototype.mmap_write32_shim=function(a,b){var c=this.cpu.memory_map_write8[a>>>17];c(a,b&255);c(a+1,b>>8&255);c(a+2,b>>16&255);c(a+3,b>>>24)};Fa.prototype.mmap_register=function(a,b,c,d,e,f){B("mmap_register addr="+
|
|
67
|
+
n(a>>>0,8)+" size="+n(b,8),32);l(0===(a&131071));l(b&&0===(b&131071));e||(e=this.mmap_read32_shim.bind(this));f||(f=this.mmap_write32_shim.bind(this));for(a>>>=17;0<b;a++)this.cpu.memory_map_read8[a]=c,this.cpu.memory_map_write8[a]=d,this.cpu.memory_map_read32[a]=e,this.cpu.memory_map_write32[a]=f,b-=131072};Fa.prototype.port_write8=function(a,b){var c=this.ports[a];c.write8===this.empty_port_write&&B("write8 port #"+n(a,4)+" <- "+n(b,2)+this.get_port_description(a),32);return c.write8.call(c.device,
|
|
68
|
+
b)};Fa.prototype.port_write16=function(a,b){var c=this.ports[a];c.write16===this.empty_port_write&&B("write16 port #"+n(a,4)+" <- "+n(b,4)+this.get_port_description(a),32);return c.write16.call(c.device,b)};Fa.prototype.port_write32=function(a,b){var c=this.ports[a];c.write32===this.empty_port_write&&B("write32 port #"+n(a,4)+" <- "+n(b>>>0,8)+this.get_port_description(a),32);return c.write32.call(c.device,b)};Fa.prototype.port_read8=function(a){var b=this.ports[a];b.read8===this.empty_port_read8&&
|
|
69
|
+
B("read8 port #"+n(a,4)+this.get_port_description(a),32);b=b.read8.call(b.device,a);l("number"===typeof b);(0>b||256<=b)&&l(!1,"8 bit port returned large value: "+n(a));return b};Fa.prototype.port_read16=function(a){var b=this.ports[a];b.read16===this.empty_port_read16&&B("read16 port #"+n(a,4)+this.get_port_description(a),32);b=b.read16.call(b.device,a);l("number"===typeof b);(0>b||65536<=b)&&l(!1,"16 bit port returned large value: "+n(a));return b};Fa.prototype.port_read32=function(a){var b=this.ports[a];
|
|
70
|
+
b.read32===this.empty_port_read32&&B("read32 port #"+n(a,4)+this.get_port_description(a),32);a=b.read32.call(b.device,a);l((a|0)===a);return a};var Ga={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",
|
|
71
|
+
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",
|
|
72
|
+
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"};Fa.prototype.get_port_description=function(a){return Ga[a]?" ("+Ga[a]+")":""};var Ia={};function Ja(){this.listeners={};this.pair=void 0}Ja.prototype.register=function(a,b,c){var d=this.listeners[a];void 0===d&&(d=this.listeners[a]=
|
|
73
|
+
[]);d.push({fn:b,this_value:c})};Ja.prototype.unregister=function(a,b){var c=this.listeners[a];void 0!==c&&(this.listeners[a]=c.filter(function(d){return d.fn!==b}))};Ja.prototype.send=function(a,b){if(this.pair&&(a=this.pair.listeners[a],void 0!==a))for(var c=0;c<a.length;c++){var d=a[c];d.fn.call(d.this_value,b)}};Ja.prototype.send_async=function(a,b){l(1===arguments.length||2===arguments.length);setTimeout(this.send.bind(this,a,b),0)};Ia.create=function(){var a=new Ja,b=new Ja;a.pair=b;b.pair=
|
|
74
|
+
a;return[a,b]};var Ka=new Uint8Array(256),La=[],Oa=[],Pa=[],Qa=new Uint8Array(256),Ra=[];function D(a,b){this.cpu=a;this.bus=b;this.write_buffer=new na(64);this.read_buffer=new na(64);this.mixer_current_address=this.command_size=this.command=this.read_buffer_lastvalue=0;this.mixer_registers=new Uint8Array(256);this.mixer_reset();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 oa(65536),new oa(65536)];this.dma=
|
|
75
|
+
a.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=1;this.dma_channel_16bit=5;this.dma_autoinit=!1;this.dma_buffer=new ArrayBuffer(65536);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 za(this.dma_buffer);this.dma_paused=
|
|
76
|
+
this.dma_waiting_transfer=!1;this.sampling_rate=22050;b.send("dac-tell-sampling-rate",this.sampling_rate);this.bytes_per_sample=1;this.e2_value=170;this.e2_count=0;this.asp_registers=new Uint8Array(256);this.mpu_read_buffer=new na(64);this.fm_current_address1=this.fm_current_address0=this.mpu_read_buffer_lastvalue=0;this.fm_waveform_select_enable=!1;this.irq=5;this.irq_triggered=new Uint8Array(16);a.io.register_read_consecutive(544,this,this.port2x0_read,this.port2x1_read,this.port2x2_read,this.port2x3_read);
|
|
77
|
+
a.io.register_read_consecutive(904,this,this.port2x0_read,this.port2x1_read);a.io.register_read_consecutive(548,this,this.port2x4_read,this.port2x5_read);a.io.register_read(550,this,this.port2x6_read);a.io.register_read(551,this,this.port2x7_read);a.io.register_read(552,this,this.port2x8_read);a.io.register_read(553,this,this.port2x9_read);a.io.register_read(554,this,this.port2xA_read);a.io.register_read(555,this,this.port2xB_read);a.io.register_read(556,this,this.port2xC_read);a.io.register_read(557,
|
|
78
|
+
this,this.port2xD_read);a.io.register_read_consecutive(558,this,this.port2xE_read,this.port2xF_read);a.io.register_write_consecutive(544,this,this.port2x0_write,this.port2x1_write,this.port2x2_write,this.port2x3_write);a.io.register_write_consecutive(904,this,this.port2x0_write,this.port2x1_write);a.io.register_write_consecutive(548,this,this.port2x4_write,this.port2x5_write);a.io.register_write(550,this,this.port2x6_write);a.io.register_write(551,this,this.port2x7_write);a.io.register_write_consecutive(552,
|
|
79
|
+
this,this.port2x8_write,this.port2x9_write);a.io.register_write(554,this,this.port2xA_write);a.io.register_write(555,this,this.port2xB_write);a.io.register_write(556,this,this.port2xC_write);a.io.register_write(557,this,this.port2xD_write);a.io.register_write(558,this,this.port2xE_write);a.io.register_write(559,this,this.port2xF_write);a.io.register_read_consecutive(816,this,this.port3x0_read,this.port3x1_read);a.io.register_write_consecutive(816,this,this.port3x0_write,this.port3x1_write);this.dma.on_unmask(this.dma_on_unmask,
|
|
80
|
+
this);b.register("dac-request-data",function(){this.dac_handle_request()},this);b.register("speaker-has-initialized",function(){this.mixer_reset()},this);b.send("speaker-confirm-initialized");this.dsp_reset()}D.prototype.dsp_reset=function(){this.write_buffer.clear();this.read_buffer.clear();this.command_size=this.command=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();
|
|
81
|
+
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(1);this.irq_triggered.fill(0);this.asp_registers.fill(0);this.asp_registers[5]=1;this.asp_registers[9]=248};D.prototype.get_state=function(){var a=[];a[2]=this.read_buffer_lastvalue;a[3]=this.command;
|
|
82
|
+
a[4]=this.command_size;a[5]=this.mixer_current_address;a[6]=this.mixer_registers;a[7]=this.dummy_speaker_enabled;a[8]=this.test_register;a[9]=this.dsp_highspeed;a[10]=this.dsp_stereo;a[11]=this.dsp_16bit;a[12]=this.dsp_signed;a[15]=this.dma_sample_count;a[16]=this.dma_bytes_count;a[17]=this.dma_bytes_left;a[18]=this.dma_bytes_block;a[19]=this.dma_irq;a[20]=this.dma_channel;a[21]=this.dma_channel_8bit;a[22]=this.dma_channel_16bit;a[23]=this.dma_autoinit;a[24]=this.dma_buffer_uint8;a[25]=this.dma_waiting_transfer;
|
|
83
|
+
a[26]=this.dma_paused;a[27]=this.sampling_rate;a[28]=this.bytes_per_sample;a[29]=this.e2_value;a[30]=this.e2_count;a[31]=this.asp_registers;a[33]=this.mpu_read_buffer_last_value;a[34]=this.irq;a[35]=this.irq_triggered;return a};D.prototype.set_state=function(a){this.read_buffer_lastvalue=a[2];this.command=a[3];this.command_size=a[4];this.mixer_current_address=a[5];this.mixer_registers=a[6];this.mixer_full_update();this.dummy_speaker_enabled=a[7];this.test_register=a[8];this.dsp_highspeed=a[9];this.dsp_stereo=
|
|
84
|
+
a[10];this.dsp_16bit=a[11];this.dsp_signed=a[12];this.dma_sample_count=a[15];this.dma_bytes_count=a[16];this.dma_bytes_left=a[17];this.dma_bytes_block=a[18];this.dma_irq=a[19];this.dma_channel=a[20];this.dma_channel_8bit=a[21];this.dma_channel_16bit=a[22];this.dma_autoinit=a[23];this.dma_buffer_uint8=a[24];this.dma_waiting_transfer=a[25];this.dma_paused=a[26];this.sampling_rate=a[27];this.bytes_per_sample=a[28];this.e2_value=a[29];this.e2_count=a[30];this.asp_registers=a[31];this.mpu_read_buffer_last_value=
|
|
85
|
+
a[33];this.irq=a[34];this.irq_triggered=a[35];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 za(this.dma_buffer);this.dma_paused?this.bus.send("dac-disable"):this.bus.send("dac-enable")};D.prototype.port2x0_read=function(){B("220 read: fm music status port (unimplemented)",8388608);return 255};D.prototype.port2x1_read=
|
|
86
|
+
function(){B("221 read: fm music data port (write only)",8388608);return 255};D.prototype.port2x2_read=function(){B("222 read: advanced fm music status port (unimplemented)",8388608);return 255};D.prototype.port2x3_read=function(){B("223 read: advanced music data port (write only)",8388608);return 255};D.prototype.port2x4_read=function(){B("224 read: mixer address port",8388608);return this.mixer_current_address};D.prototype.port2x5_read=function(){B("225 read: mixer data port",8388608);return this.mixer_read(this.mixer_current_address)};
|
|
87
|
+
D.prototype.port2x6_read=function(){B("226 read: (write only)",8388608);return 255};D.prototype.port2x7_read=function(){B("227 read: undocumented",8388608);return 255};D.prototype.port2x8_read=function(){B("228 read: fm music status port (unimplemented)",8388608);return 255};D.prototype.port2x9_read=function(){B("229 read: fm music data port (write only)",8388608);return 255};D.prototype.port2xA_read=function(){B("22A read: read data",8388608);this.read_buffer.length&&(this.read_buffer_lastvalue=
|
|
88
|
+
this.read_buffer.shift());B(" <- "+this.read_buffer_lastvalue+" "+n(this.read_buffer_lastvalue)+" '"+String.fromCharCode(this.read_buffer_lastvalue)+"'",8388608);return this.read_buffer_lastvalue};D.prototype.port2xB_read=function(){B("22B read: undocumented",8388608);return 255};D.prototype.port2xC_read=function(){B("22C read: write-buffer status",8388608);return 127};D.prototype.port2xD_read=function(){B("22D read: undocumented",8388608);return 255};D.prototype.port2xE_read=function(){B("22E read: read-buffer status / irq 8bit ack.",
|
|
89
|
+
8388608);this.irq_triggered[1]&&this.lower_irq(1);return(this.read_buffer.length&&!this.dsp_highspeed)<<7|127};D.prototype.port2xF_read=function(){B("22F read: irq 16bit ack",8388608);this.lower_irq(2);return 0};D.prototype.port2x0_write=function(a){B("220 write: (unimplemented) fm register 0 address = "+n(a),8388608);this.fm_current_address0=0};D.prototype.port2x1_write=function(a){B("221 write: (unimplemented) fm register 0 data = "+n(a),8388608);var b=Ra[this.fm_current_address0];b||(b=this.fm_default_write);
|
|
90
|
+
b.call(this,a,0,this.fm_current_address0)};D.prototype.port2x2_write=function(a){B("222 write: (unimplemented) fm register 1 address = "+n(a),8388608);this.fm_current_address1=0};D.prototype.port2x3_write=function(a){B("223 write: (unimplemented) fm register 1 data ="+n(a),8388608);var b=Ra[this.fm_current_address1];b||(b=this.fm_default_write);b.call(this,a,1,this.fm_current_address1)};D.prototype.port2x4_write=function(a){B("224 write: mixer address = "+n(a),8388608);this.mixer_current_address=
|
|
91
91
|
a};D.prototype.port2x5_write=function(a){B("225 write: mixer data = "+n(a),8388608);this.mixer_write(this.mixer_current_address,a)};D.prototype.port2x6_write=function(a){B("226 write: reset = "+n(a),8388608);this.dsp_highspeed?(B(" -> exit highspeed",8388608),this.dsp_highspeed=!1):a&&(B(" -> reset",8388608),this.dsp_reset());this.read_buffer.clear();this.read_buffer.push(170)};D.prototype.port2x7_write=function(){B("227 write: undocumented",8388608)};D.prototype.port2x8_write=function(){B("228 write: fm music register port (unimplemented)",
|
|
92
|
-
8388608)};D.prototype.port2x9_write=function(){B("229 write: fm music data port (unimplemented)",8388608)};D.prototype.port2xA_write=function(){B("22A write: dsp read data port (read only)",8388608)};D.prototype.port2xB_write=function(){B("22B write: undocumented",8388608)};D.prototype.port2xC_write=function(a){B("22C write: write command/data",8388608);0===this.command?(B("22C write: command = "+n(a),8388608),this.command=a,this.write_buffer.clear(),this.command_size=
|
|
92
|
+
8388608)};D.prototype.port2x9_write=function(){B("229 write: fm music data port (unimplemented)",8388608)};D.prototype.port2xA_write=function(){B("22A write: dsp read data port (read only)",8388608)};D.prototype.port2xB_write=function(){B("22B write: undocumented",8388608)};D.prototype.port2xC_write=function(a){B("22C write: write command/data",8388608);0===this.command?(B("22C write: command = "+n(a),8388608),this.command=a,this.write_buffer.clear(),this.command_size=Ka[a]):(B("22C write: data: "+
|
|
93
93
|
n(a),8388608),this.write_buffer.push(a));this.write_buffer.length>=this.command_size&&this.command_do()};D.prototype.port2xD_write=function(){B("22D write: undocumented",8388608)};D.prototype.port2xE_write=function(){B("22E write: dsp read buffer status (read only)",8388608)};D.prototype.port2xF_write=function(){B("22F write: undocumented",8388608)};D.prototype.port3x0_read=function(){B("330 read: mpu data",8388608);this.mpu_read_buffer.length&&(this.mpu_read_buffer_lastvalue=this.mpu_read_buffer.shift());
|
|
94
|
-
B(" <- "+n(this.mpu_read_buffer_lastvalue),8388608);return this.mpu_read_buffer_lastvalue};D.prototype.port3x0_write=function(a){B("330 write: mpu data (unimplemented) : "+n(a),8388608)};D.prototype.port3x1_read=function(){B("331 read: mpu status",8388608);return 0|128*!this.mpu_read_buffer.length};D.prototype.port3x1_write=function(a){B("331 write: mpu command: "+n(a),8388608);255===a&&(this.mpu_read_buffer.clear(),this.mpu_read_buffer.push(254))};D.prototype.command_do=function(){var a=
|
|
95
|
-
a||(a=this.dsp_default_handler);a.call(this);this.command_size=this.command=0;this.write_buffer.clear()};D.prototype.dsp_default_handler=function(){B("Unhandled command: "+n(this.command),8388608)};function H(a,b,c){c||(c=D.prototype.dsp_default_handler);for(var d=0;d<a.length;d++)
|
|
96
|
-
this.read_buffer.push(this.asp_registers[this.write_buffer.shift()])});H([16],1,function(){var a=this.write_buffer.shift();a=
|
|
94
|
+
B(" <- "+n(this.mpu_read_buffer_lastvalue),8388608);return this.mpu_read_buffer_lastvalue};D.prototype.port3x0_write=function(a){B("330 write: mpu data (unimplemented) : "+n(a),8388608)};D.prototype.port3x1_read=function(){B("331 read: mpu status",8388608);return 0|128*!this.mpu_read_buffer.length};D.prototype.port3x1_write=function(a){B("331 write: mpu command: "+n(a),8388608);255===a&&(this.mpu_read_buffer.clear(),this.mpu_read_buffer.push(254))};D.prototype.command_do=function(){var a=La[this.command];
|
|
95
|
+
a||(a=this.dsp_default_handler);a.call(this);this.command_size=this.command=0;this.write_buffer.clear()};D.prototype.dsp_default_handler=function(){B("Unhandled command: "+n(this.command),8388608)};function H(a,b,c){c||(c=D.prototype.dsp_default_handler);for(var d=0;d<a.length;d++)Ka[a[d]]=b,La[a[d]]=c}function Sa(a){for(var b=[],c=0;16>c;c++)b.push(a+c);return b}H([14],2,function(){this.asp_registers[this.write_buffer.shift()]=this.write_buffer.shift()});H([15],1,function(){this.read_buffer.clear();
|
|
96
|
+
this.read_buffer.push(this.asp_registers[this.write_buffer.shift()])});H([16],1,function(){var a=this.write_buffer.shift();a=Ta(a/127.5+-1,-1,1);this.dac_buffers[0].push(a);this.dac_buffers[1].push(a);this.bus.send("dac-enable")});H([20,21],2,function(){this.dma_irq=1;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()});H([22],2);H([23],2);H([28],0,function(){this.dma_irq=1;this.dma_channel=
|
|
97
97
|
this.dma_channel_8bit;this.dma_autoinit=!0;this.dsp_highspeed=this.dsp_16bit=this.dsp_signed=!1;this.dma_transfer_start()});H([31],0);H([32],0,function(){this.read_buffer.clear();this.read_buffer.push(127)});H([36],2);H([44],0);H([48],0);H([49],0);H([52],0);H([53],0);H([54],0);H([55],0);H([56],0);H([64],1,function(){this.sampling_rate_change(1E6/(256-this.write_buffer.shift())/this.get_channel_count())});H([65,66],2,function(){this.sampling_rate_change(this.write_buffer.shift()<<8|this.write_buffer.shift())});
|
|
98
|
-
H([72],2,function(){this.dma_transfer_size_set()});H([116],2);H([117],2);H([118],2);H([119],2);H([125],0);H([127],0);H([128],2);H([144],0,function(){this.dma_irq=1;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()});H([145],0);H([152],0);H([153],0);H([160],0);H([168],0);H(
|
|
99
|
-
this.dma_channel_16bit;this.dma_autoinit=!!(this.command&4);this.dsp_signed=!!(a&16);this.dsp_stereo=!!(a&32);this.dsp_16bit=!0;this.dma_transfer_size_set();this.dma_transfer_start()}});H(
|
|
98
|
+
H([72],2,function(){this.dma_transfer_size_set()});H([116],2);H([117],2);H([118],2);H([119],2);H([125],0);H([127],0);H([128],2);H([144],0,function(){this.dma_irq=1;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()});H([145],0);H([152],0);H([153],0);H([160],0);H([168],0);H(Sa(176),3,function(){if(this.command&8)this.dsp_default_handler();else{var a=this.write_buffer.shift();this.dma_irq=2;this.dma_channel=
|
|
99
|
+
this.dma_channel_16bit;this.dma_autoinit=!!(this.command&4);this.dsp_signed=!!(a&16);this.dsp_stereo=!!(a&32);this.dsp_16bit=!0;this.dma_transfer_size_set();this.dma_transfer_start()}});H(Sa(192),3,function(){if(this.command&8)this.dsp_default_handler();else{var a=this.write_buffer.shift();this.dma_irq=1;this.dma_channel=this.dma_channel_8bit;this.dma_autoinit=!!(this.command&4);this.dsp_signed=!!(a&16);this.dsp_stereo=!!(a&32);this.dsp_16bit=!1;this.dma_transfer_size_set();this.dma_transfer_start()}});
|
|
100
100
|
H([208],0,function(){this.dma_paused=!0;this.bus.send("dac-disable")});H([209],0,function(){this.dummy_speaker_enabled=!0});H([211],0,function(){this.dummy_speaker_enabled=!1});H([212],0,function(){this.dma_paused=!1;this.bus.send("dac-enable")});H([213],0,function(){this.dma_paused=!0;this.bus.send("dac-disable")});H([214],0,function(){this.dma_paused=!1;this.bus.send("dac-enable")});H([216],0,function(){this.read_buffer.clear();this.read_buffer.push(255*this.dummy_speaker_enabled)});H([217,218],
|
|
101
101
|
0,function(){this.dma_autoinit=!1});H([224],1,function(){this.read_buffer.clear();this.read_buffer.push(~this.write_buffer.shift())});H([225],0,function(){this.read_buffer.clear();this.read_buffer.push(4);this.read_buffer.push(5)});H([226],1);H([227],0,function(){this.read_buffer.clear();for(var a=0;44>a;a++)this.read_buffer.push("COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.".charCodeAt(a));this.read_buffer.push(0)});H([228],1,function(){this.test_register=this.write_buffer.shift()});H([232],0,function(){this.read_buffer.clear();
|
|
102
|
-
this.read_buffer.push(this.test_register)});H([242,243],0,function(){this.raise_irq()});var
|
|
103
|
-
b){var c=
|
|
102
|
+
this.read_buffer.push(this.test_register)});H([242,243],0,function(){this.raise_irq()});var Ua=new Uint8Array(256);Ua[14]=255;Ua[15]=7;Ua[55]=56;H([249],1,function(){var a=this.write_buffer.shift();B("dsp 0xf9: unknown function. input: "+a,8388608);this.read_buffer.clear();this.read_buffer.push(Ua[a])});D.prototype.mixer_read=function(a){var b=Oa[a];b?b=b.call(this):(b=this.mixer_registers[a],B("unhandled mixer register read. addr:"+n(a)+" data:"+n(b),8388608));return b};D.prototype.mixer_write=function(a,
|
|
103
|
+
b){var c=Pa[a];c?c.call(this,b):B("unhandled mixer register write. addr:"+n(a)+" data:"+n(b),8388608)};D.prototype.mixer_default_read=function(){B("mixer register read. addr:"+n(this.mixer_current_address),8388608);return this.mixer_registers[this.mixer_current_address]};D.prototype.mixer_default_write=function(a){B("mixer register write. addr:"+n(this.mixer_current_address)+" data:"+n(a),8388608);this.mixer_registers[this.mixer_current_address]=a};D.prototype.mixer_reset=function(){this.mixer_registers[4]=
|
|
104
104
|
204;this.mixer_registers[34]=204;this.mixer_registers[38]=204;this.mixer_registers[40]=0;this.mixer_registers[46]=0;this.mixer_registers[10]=0;this.mixer_registers[48]=192;this.mixer_registers[49]=192;this.mixer_registers[50]=192;this.mixer_registers[51]=192;this.mixer_registers[52]=192;this.mixer_registers[53]=192;this.mixer_registers[54]=0;this.mixer_registers[55]=0;this.mixer_registers[56]=0;this.mixer_registers[57]=0;this.mixer_registers[59]=0;this.mixer_registers[60]=31;this.mixer_registers[61]=
|
|
105
|
-
21;this.mixer_registers[62]=11;this.mixer_registers[63]=0;this.mixer_registers[64]=0;this.mixer_registers[65]=0;this.mixer_registers[66]=0;this.mixer_registers[67]=0;this.mixer_registers[68]=128;this.mixer_registers[69]=128;this.mixer_registers[70]=128;this.mixer_registers[71]=128;this.mixer_full_update()};D.prototype.mixer_full_update=function(){for(var a=1;a<this.mixer_registers.length;a++)
|
|
106
|
-
|
|
107
|
-
return 0});
|
|
108
|
-
a-(16>a?14:16))});
|
|
109
|
-
2);a&2&&(this.irq=5);a&4&&(this.irq=7);a&8&&(this.irq=10)});
|
|
110
|
-
b=0;16>b;b++)a|=b*this.irq_triggered[b];return a});D.prototype.fm_default_write=function(a,b,c){B("unhandled fm register write. addr:"+b+"|"+n(c)+" data:"+n(a),8388608)};function
|
|
111
|
-
17
|
|
105
|
+
21;this.mixer_registers[62]=11;this.mixer_registers[63]=0;this.mixer_registers[64]=0;this.mixer_registers[65]=0;this.mixer_registers[66]=0;this.mixer_registers[67]=0;this.mixer_registers[68]=128;this.mixer_registers[69]=128;this.mixer_registers[70]=128;this.mixer_registers[71]=128;this.mixer_full_update()};D.prototype.mixer_full_update=function(){for(var a=1;a<this.mixer_registers.length;a++)Qa[a]||this.mixer_write(a,this.mixer_registers[a])};function Wa(a,b){b||(b=D.prototype.mixer_default_read);
|
|
106
|
+
Oa[a]=b}function Xa(a,b){b||(b=D.prototype.mixer_default_write);Pa[a]=b}function Ya(a,b,c){Qa[a]=1;Oa[a]=function(){return this.mixer_registers[b]&240|this.mixer_registers[c]>>>4};Pa[a]=function(d){this.mixer_registers[a]=d;var e=d<<4&240|this.mixer_registers[c]&15;this.mixer_write(b,d&240|this.mixer_registers[b]&15);this.mixer_write(c,e)}}function Za(a,b,c){Oa[a]=D.prototype.mixer_default_read;Pa[a]=function(d){this.mixer_registers[a]=d;this.bus.send("mixer-volume",[b,c,(d>>>2)-62])}}Wa(0,function(){this.mixer_reset();
|
|
107
|
+
return 0});Xa(0);Ya(4,50,51);Ya(34,48,49);Ya(38,52,53);Ya(40,54,55);Ya(46,56,57);Za(48,0,0);Za(49,0,1);Za(50,2,0);Za(51,2,1);Wa(59);Xa(59,function(a){this.mixer_registers[59]=a;this.bus.send("mixer-volume",[1,2,6*(a>>>6)-18])});Wa(65);Xa(65,function(a){this.mixer_registers[65]=a;this.bus.send("mixer-gain-left",6*(a>>>6))});Wa(66);Xa(66,function(a){this.mixer_registers[66]=a;this.bus.send("mixer-gain-right",6*(a>>>6))});Wa(68);Xa(68,function(a){this.mixer_registers[68]=a;a>>>=3;this.bus.send("mixer-treble-left",
|
|
108
|
+
a-(16>a?14:16))});Wa(69);Xa(69,function(a){this.mixer_registers[69]=a;a>>>=3;this.bus.send("mixer-treble-right",a-(16>a?14:16))});Wa(70);Xa(70,function(a){this.mixer_registers[70]=a;a>>>=3;this.bus.send("mixer-bass-right",a-(16>a?14:16))});Wa(71);Xa(71,function(a){this.mixer_registers[71]=a;a>>>=3;this.bus.send("mixer-bass-right",a-(16>a?14:16))});Wa(128,function(){switch(this.irq){case 2:return 1;case 5:return 2;case 7:return 4;case 10:return 8;default:return 0}});Xa(128,function(a){a&1&&(this.irq=
|
|
109
|
+
2);a&2&&(this.irq=5);a&4&&(this.irq=7);a&8&&(this.irq=10)});Wa(129,function(){var a=0;switch(this.dma_channel_8bit){case 0:a|=1;break;case 1:a|=2;break;case 3:a|=8}switch(this.dma_channel_16bit){case 5:a|=32;break;case 6:a|=64;break;case 7:a|=128}return a});Xa(129,function(a){a&1&&(this.dma_channel_8bit=0);a&2&&(this.dma_channel_8bit=1);a&8&&(this.dma_channel_8bit=3);a&32&&(this.dma_channel_16bit=5);a&64&&(this.dma_channel_16bit=6);a&128&&(this.dma_channel_16bit=7)});Wa(130,function(){for(var a=32,
|
|
110
|
+
b=0;16>b;b++)a|=b*this.irq_triggered[b];return a});D.prototype.fm_default_write=function(a,b,c){B("unhandled fm register write. addr:"+b+"|"+n(c)+" data:"+n(a),8388608)};function $a(a,b){b||(b=D.prototype.fm_default_write);for(var c=0;c<a.length;c++)Ra[a[c]]=b}function ab(a,b){for(var c=[];a<=b;a++)c.push(a);return c}const bb=new Uint8Array(32);bb[0]=0;bb[1]=1;bb[2]=2;bb[3]=3;bb[4]=4;bb[5]=5;bb[8]=6;bb[9]=7;bb[10]=8;bb[11]=9;bb[12]=10;bb[13]=11;bb[16]=12;bb[17]=13;bb[18]=14;bb[19]=15;bb[20]=16;bb[21]=
|
|
111
|
+
17;$a([1],function(a,b){this.fm_waveform_select_enable[b]=a&1;this.fm_update_waveforms()});$a([2]);$a([3]);$a([4],function(){});$a([5],function(a,b,c){0===b&&this.fm_default_write(a,b,c)});$a([8],function(){});$a(ab(32,53),function(){});$a(ab(64,85),function(){});$a(ab(96,117),function(){});$a(ab(128,149),function(){});$a(ab(160,168),function(){});$a(ab(176,184),function(){});$a([189],function(){});$a(ab(192,200),function(){});$a(ab(224,245),function(){});D.prototype.fm_update_waveforms=function(){};
|
|
112
112
|
D.prototype.sampling_rate_change=function(a){this.sampling_rate=a;this.bus.send("dac-tell-sampling-rate",a)};D.prototype.get_channel_count=function(){return this.dsp_stereo?2:1};D.prototype.dma_transfer_size_set=function(){this.dma_sample_count=1+(this.write_buffer.shift()<<0)+(this.write_buffer.shift()<<8)};D.prototype.dma_transfer_start=function(){B("begin dma transfer",8388608);this.bytes_per_sample=1;this.dsp_16bit&&(this.bytes_per_sample*=2);this.dma_bytes_count=this.dma_sample_count*this.bytes_per_sample;
|
|
113
113
|
this.dma_bytes_block=1024*this.bytes_per_sample;this.dma_bytes_block=Math.min(Math.max(this.dma_bytes_count>>2&-4,32),this.dma_bytes_block);this.dma_waiting_transfer=!0;this.dma.channel_mask[this.dma_channel]||this.dma_on_unmask(this.dma_channel)};D.prototype.dma_on_unmask=function(a){a===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("dac-enable"))};D.prototype.dma_transfer_next=function(){B("dma transfering next block",
|
|
114
114
|
8388608);var a=Math.min(this.dma_bytes_left,this.dma_bytes_block),b=Math.floor(a/this.bytes_per_sample);this.dma.do_write(this.dma_syncbuffer,0,a,this.dma_channel,c=>{B("dma block transfer "+(c?"unsuccessful":"successful"),8388608);c||(this.dma_to_dac(b),this.dma_bytes_left-=a,this.dma_bytes_left||(this.raise_irq(this.dma_irq),this.dma_autoinit&&(this.dma_bytes_left=this.dma_bytes_count)))})};D.prototype.dma_to_dac=function(a){var b=this.dsp_16bit?32767.5:127.5,c=this.dsp_signed?0:-1,d=this.dsp_stereo?
|
|
115
|
-
1:2;var e=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;for(var f=0,
|
|
116
|
-
b=this.dac_buffers[1].shift_block(this.dac_buffers[1].length);this.bus.send("dac-send-data",[a,b],[a.buffer,b.buffer])}};D.prototype.raise_irq=function(a){B("raise irq",8388608);this.irq_triggered[a]=1;this.cpu.device_raise_irq(this.irq)};D.prototype.lower_irq=function(a){B("lower irq",8388608);this.irq_triggered[a]=0;this.cpu.device_lower_irq(this.irq)};function
|
|
117
|
-
Int16Array,Uint32Array,Int32Array,Float32Array,Float64Array};function
|
|
118
|
-
a);c=a.get_state();a=[];for(var d=0;d<c.length;d++){var e=c[d];
|
|
119
|
-
if(-2039052682!==t[0])throw new
|
|
120
|
-
new Uint8Array(a.wasm_memory.buffer,f,16),
|
|
121
|
-
v);r+=v}}else q=a.zstd_read(e,m+p.length),r=q+m,
|
|
122
|
-
d?"unguarded register":e?"wasm size":"executed";for(let q=0;256>q;q++)for(let r=0;8>r;r++)for(const v of[!1,!0]){var m=a.wm.exports.get_opstats_buffer(b,c,d,e,q,!1,v,r);
|
|
123
|
-
count:r}of
|
|
124
|
-
f+" ";f+="\n";
|
|
125
|
-
this.cmos_c=0;this.update_interrupt=!1;this.update_interrupt_time=0;a.io.register_write(112,this,function(b){this.cmos_index=b&127;this.nmi_disabled=b>>7});a.io.register_write(113,this,this.cmos_port_write);a.io.register_read(113,this,this.cmos_port_read)}
|
|
126
|
-
this.cmos_a;a[9]=this.cmos_b;a[10]=this.cmos_c;a[11]=this.nmi_disabled;a[12]=this.update_interrupt;a[13]=this.update_interrupt_time;return a};
|
|
127
|
-
a[13]||0};
|
|
128
|
-
this.cmos_c|=144,this.update_interrupt_time=a+1E3);let b=100;this.periodic_interrupt&&this.next_interrupt&&(b=Math.min(b,Math.max(0,this.next_interrupt-a)));this.next_interrupt_alarm&&(b=Math.min(b,Math.max(0,this.next_interrupt_alarm-a)));this.update_interrupt&&(b=Math.min(b,Math.max(0,this.update_interrupt_time-a)));return b};
|
|
129
|
-
|
|
130
|
-
65536),this.encode_time((new Date(this.rtc_time)).getUTCMinutes());case 4:return B("read hour: "+n(this.encode_time((new Date(this.rtc_time)).getUTCHours())),65536),this.encode_time((new Date(this.rtc_time)).getUTCHours());case 6:return B("read day: "+n(this.encode_time((new Date(this.rtc_time)).getUTCDay()+1)),65536),this.encode_time((new Date(this.rtc_time)).getUTCDay()+1);case 7:return B("read day of month: "+n(this.encode_time((new Date(this.rtc_time)).getUTCDate())),
|
|
131
|
-
case 8:return B("read month: "+n(this.encode_time((new Date(this.rtc_time)).getUTCMonth()+1)),65536),this.encode_time((new Date(this.rtc_time)).getUTCMonth()+1);case 9:return B("read year: "+n(this.encode_time((new Date(this.rtc_time)).getUTCFullYear()%100)),65536),this.encode_time((new Date(this.rtc_time)).getUTCFullYear()%100);case 10:return 999<=I.microtick()%1E3?this.cmos_a|128:this.cmos_a;case 11:return this.cmos_b;case 12:return this.cpu.device_lower_irq(8),
|
|
132
|
-
this.cmos_c&=-241,a;case 13:return
|
|
133
|
-
2)+" t="+this.periodic_interrupt_time,65536);break;case 11:this.cmos_b=a;this.cmos_b&128&&(this.cmos_b&=239);this.cmos_b&64&&(this.next_interrupt=Date.now());if(this.cmos_b&32){a=new Date;const b=this.decode_time(this.cmos_data[1]),c=this.decode_time(this.cmos_data[3]),d=this.decode_time(this.cmos_data[5]),e=new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate(),d,c,b));B("RTC alarm scheduled for "+
|
|
134
|
-
16&&(B("update interrupt",65536),this.update_interrupt_time=Date.now());B("cmos b="+n(this.cmos_b,2),65536);break;case 1:case 3:case 5:this.cmos_write(this.cmos_index,a);break;default:B("cmos write index "+n(this.cmos_index)+": "+n(a),65536)}this.update_interrupt=16===(this.cmos_b&16)&&0<(this.cmos_a&15);this.periodic_interrupt=64===(this.cmos_b&64)&&0<(this.cmos_a&
|
|
135
|
-
n(b),65536);
|
|
136
|
-
d=66.66666666666667*c&1;c=this.did_rollover(2,c);return d<<4|c<<5});a.io.register_write(97,this,function(c){c&1?this.bus.send("pcspeaker-enable"):this.bus.send("pcspeaker-disable")});a.io.register_read(64,this,function(){return this.counter_read(0)});a.io.register_read(65,this,function(){return this.counter_read(1)});a.io.register_read(66,this,function(){return this.counter_read(2)});
|
|
137
|
-
c)});a.io.register_write(66,this,function(c){this.counter_write(2,c);this.bus.send("pcspeaker-update",[this.counter_mode[2],this.counter_reload[2]])});a.io.register_write(67,this,this.port43_write)}
|
|
138
|
-
function(a){this.counter_next_low=a[0];this.counter_enabled=a[1];this.counter_mode=a[2];this.counter_read_mode=a[3];this.counter_latch=a[4];this.counter_latch_value=a[5];this.counter_reload=a[6];this.counter_start_time=a[7];this.counter_start_value=a[8]};
|
|
139
|
-
this.cpu.device_raise_irq(0),0===this.counter_mode[0]&&(this.counter_enabled[0]=0)):this.cpu.device_lower_irq(0),this.counter_enabled[0]&&(c=(this.counter_start_value[0]-Math.floor(1193.1816666*(a-this.counter_start_time[0])))/1193.1816666));return c};
|
|
140
|
-
512);c=this.counter_reload[a];b>=c?(B("Warning: Counter"+a+" value "+b+" is larger than reload "+c,512),b%=c):0>b&&(b=b%c+c);return b};
|
|
141
|
-
8;b=this.counter_next_low[a];3===this.counter_mode[a]&&(this.counter_next_low[a]^=1);a=this.get_counter_value(a,I.microtick());return b?a&255:a>>8};
|
|
142
|
-
I.microtick(),B("counter"+a+" reload="+n(this.counter_reload[a])+" tick="+(this.counter_reload[a]||65536)/1193.1816666+"ms",512));3===this.counter_read_mode[a]&&(this.counter_next_low[a]^=1)};
|
|
143
|
-
b+" ctr="+d+" read_mode="+a+" bcd="+c,512),this.counter_next_low[d]=1===a?1:2===a?0:1,0===d&&this.cpu.device_lower_irq(0),0!==b&&3!==b&&2!==b&&B("Unimplemented counter mode: "+n(b),512),this.counter_mode[d]=b,this.counter_read_mode[d]=a,2===d&&this.bus.send("pcspeaker-update",[this.counter_mode[2],this.counter_reload[2]]))};
|
|
144
|
-
window.webkitAudioContext){var b=window.AudioWorklet?
|
|
145
|
-
function(){a.send("speaker-has-initialized")},this);a.send("speaker-has-initialized")}else console.warn("Web browser doesn't support Web Audio API")}
|
|
146
|
-
this.gain_left=this.volume_right=this.volume_left=this.volume_both=1;this.node_treble_left=this.audio_context.createBiquadFilter();this.node_treble_right=this.audio_context.createBiquadFilter();this.node_treble_left.type="highshelf";this.node_treble_right.type="highshelf";this.node_treble_left.frequency.setValueAtTime(2E3,this.audio_context.currentTime);this.node_treble_right.frequency.setValueAtTime(2E3,this.audio_context.currentTime);
|
|
147
|
-
this.audio_context.createBiquadFilter();this.node_bass_left.type="lowshelf";this.node_bass_right.type="lowshelf";this.node_bass_left.frequency.setValueAtTime(200,this.audio_context.currentTime);this.node_bass_right.frequency.setValueAtTime(200,this.audio_context.currentTime);this.node_gain_left=this.audio_context.createGain();this.node_gain_right=this.audio_context.createGain();this.node_merger=this.audio_context.createChannelMerger(2);
|
|
148
|
-
this.node_treble_left.connect(this.node_bass_left);this.node_bass_left.connect(this.node_gain_left);this.node_gain_left.connect(this.node_merger,0,0);this.node_treble_right.connect(this.node_bass_right);this.node_bass_right.connect(this.node_gain_right);this.node_gain_right.connect(this.node_merger,0,1);this.node_merger.connect(this.audio_context.destination);a.register("mixer-connect",function(d){this.connect_source(d[0],
|
|
149
|
-
d[1])},this);a.register("mixer-volume",function(d){var e=d[0],f=d[1];d=Math.pow(10,d[2]/20);var
|
|
150
|
-
c(this.node_treble_right),this);a.register("mixer-bass-left",c(this.node_bass_left),this);a.register("mixer-bass-right",c(this.node_bass_right),this)}
|
|
151
|
-
|
|
152
|
-
this.volume_left*this.gain_left,this.audio_context.currentTime);this.node_gain_right.gain.setValueAtTime(a,this.audio_context.currentTime)};function
|
|
153
|
-
this.node_splitter.connect(this.node_gain_right,1);this.node_gain_right.connect(d)}
|
|
154
|
-
1===a)this.connected_right=!0;this.update()};
|
|
155
|
-
b.createOscillator();this.node_oscillator.type="square";this.node_oscillator.frequency.setValueAtTime(440,b.currentTime);this.mixer_connection=c.add_source(this.node_oscillator,1);this.mixer_connection.disconnect();a.register("pcspeaker-enable",function(){c.connect_source(1)},this);a.register("pcspeaker-disable",function(){c.disconnect_source(1)},this);a.register("pcspeaker-update",
|
|
156
|
-
0));this.node_oscillator.frequency.setValueAtTime(f,b.currentTime)},this)}
|
|
157
|
-
0;p.source_buffer_previous=m;p.source_buffer_current=m;p.source_samples_per_destination=1;p.source_block_start=0;p.source_time=0;p.source_offset=0;p.port.onmessage=q=>{switch(q.data.type){case "queue":p.queue_push(q.data.value);break;case "sampling-rate":p.source_samples_per_destination=q.data.value/sampleRate}};return p}var m=[new Float32Array(256),new Float32Array(256)];Reflect.setPrototypeOf(
|
|
158
|
-
|
|
159
|
-
this.source_offset;q+=this.kernel_size+2;this.source_time-=this.source_offset;this.source_block_start+=this.source_offset;this.source_offset=0;this.ensure_enough_data(q);return!0};
|
|
160
|
-
p&&(this.prepare_next_buffer(),this.source_block_start-=q)};
|
|
161
|
-
p=Math.max(p,256);p=[new Float32Array(p),new Float32Array(p)];p[0].set(this.source_buffer_current[0]);p[1].set(this.source_buffer_current[1]);q=this.source_buffer_current[0].length;for(var v=0;v<r;v++){var t=this.queue_shift();p[0].set(t[0],q);p[1].set(t[1],q);q+=t[0].length}this.source_buffer_current=p}this.pump()};
|
|
162
|
-
(this.queue_data[this.queue_end]=p,this.queue_end=this.queue_end+1&this.queue_size-1,this.queue_length++,this.queued_samples+=p[0].length,this.pump())};
|
|
163
|
-
|
|
164
|
-
this.node_processor.port.postMessage({type:"sampling-rate",value:this.sampling_rate});this.node_processor.port.onmessage=
|
|
165
|
-
a.register("dac-disable",function(){this.enabled=!1},this);a.register("dac-tell-sampling-rate",function(
|
|
166
|
-
function(){this.enabled&&this.bus.send("dac-request-data")};function
|
|
167
|
-
|
|
168
|
-
this.audio_context.createBuffer(2,b*this.rate_ratio,this.sampling_rate*this.rate_ratio);for(var e=d.getChannelData(0),f=d.getChannelData(1),
|
|
169
|
-
this.pump.bind(this));d=this.audio_context.currentTime;if(this.buffered_time<d)for(B("Speaker DAC - Creating/Recreating reserve - shouldn't occur frequently during playback"),this.buffered_time=d,d=.2-c,b=0;b<=d;)b+=c,this.buffered_time+=c,setTimeout(()=>this.pump(),1E3*b);a.start(this.buffered_time);this.buffered_time+=c;setTimeout(()=>this.pump(),0)};
|
|
170
|
-
b){this.audio_context=a;this.node_source=b;this.node_processor=null;this.node_gain=this.audio_context.createGain();this.node_gain.gain.setValueAtTime(0,this.audio_context.currentTime);this.node_gain.connect(this.audio_context.destination);this.is_active=!1;this.queued_history=[];this.output_history=[];this.queued=[[],[]];this.output=[[],[]]}
|
|
171
|
-
this.node_processor=this.audio_context.createScriptProcessor(1024,2,2);this.node_processor.onaudioprocess=b=>{this.output[0].push(b.inputBuffer.getChannelData(0).slice());this.output[1].push(b.inputBuffer.getChannelData(1).slice())};this.node_source.connect(this.node_processor);this.node_processor.connect(this.node_gain);setTimeout(()=>{this.stop()},a)};
|
|
172
|
-
null};
|
|
173
|
-
this.id=c||0;this.send_queue=[];this.url=a;this.reconnect_interval=1E4;this.last_connect_attempt=Date.now()-this.reconnect_interval;this.send_queue_limit=64;this.destroyed=!1;this.bus.register("net"+this.id+"-send",function(d){this.send(d)},this)}
|
|
174
|
-
function(){for(var a=0;a<this.send_queue.length;a++)this.send(this.send_queue[a]);this.send_queue=[]};
|
|
175
|
-
return}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)}}};
|
|
176
|
-
function(a){this.url=a;this.socket&&(this.socket.onclose=function(){},this.socket.onerror=function(){},this.socket.close(),this.socket=void 0)};const
|
|
177
|
-
b?Math.max(b,a):0;this.length=this.head=this.tail=0;this.buffer=new Uint8Array(a)}write(a){const b=a.length;var c=this.length+b;let d=this.buffer.length;if(d<c){for(
|
|
178
|
-
this.head);this.head=e%d;this.length+=b}peek(a){const b=Math.min(this.length,a.length);if(b){const e=this.buffer;var c=e.length,d=this.tail+b;d>c?(d%=c,c-=this.tail,a.set(e.subarray(this.tail)),a.set(e.subarray(0,d),c)):a.set(e.subarray(this.tail,d))}return b}remove(a){a>this.length&&(a=this.length);a&&(this.tail=(this.tail+a)%this.buffer.length,this.length-=a);return a}}function
|
|
179
|
-
c+14,1500),ipv4_payload_view:new DataView(b,c+34,1480),udp_payload_view:new DataView(b,c+42,1472),text_encoder:new TextEncoder}}function
|
|
180
|
-
e,a);e.setUint16(12,b.eth.ethertype);e=14;if(b.arp){var f=a.eth_payload_view;f.setUint16(0,b.arp.htype);f.setUint16(2,b.arp.ptype);f.setUint8(4,b.arp.sha.length);f.setUint8(5,b.arp.spa.length);f.setUint16(6,b.arp.oper);
|
|
181
|
-
Gb(m,0,
|
|
182
|
-
r,q,a);m+=p}else if(b.dns){r=p;p=a.udp_payload_view;p.setUint16(0,b.dns.id);p.setUint16(2,b.dns.flags);p.setUint16(4,b.dns.questions.length);p.setUint16(6,b.dns.answers.length);let z=12;for(var v=0;v<b.dns.questions.length;++v){var t=b.dns.questions[v];for(q of t.name){const A=a.text_encoder.encodeInto(q,a.eth_frame.subarray(p.byteOffset+(z+1))).written;p.setUint8(z,A);z+=1+A}p.setUint16(z,t.type);z+=2;p.setUint16(z,
|
|
183
|
-
a.text_encoder.encodeInto(m,a.eth_frame.subarray(p.byteOffset+(z+1))).written,p.setUint8(z,t),z+=1+t;p.setUint16(z,q.type);z+=2;p.setUint16(z,q.class);z+=2;p.setUint32(z,q.ttl);z+=4;p.setUint16(z,q.data.length);z+=2;z+=
|
|
184
|
-
q.setUint32(20,b.ntp.ref_ts_f),q.setUint32(24,b.ntp.ori_ts_i),q.setUint32(28,b.ntp.ori_ts_f),q.setUint32(32,b.ntp.rec_ts_i),q.setUint32(36,b.ntp.rec_ts_f),q.setUint32(40,b.ntp.trans_ts_i),q.setUint32(44,b.ntp.trans_ts_f),m+=48):m=p+
|
|
185
|
-
b.ipv4.dest[3])+17+p,
|
|
186
|
-
8|b.ipv4.src[3])+(b.ipv4.dest[0]<<8|b.ipv4.dest[1])+(b.ipv4.dest[2]<<8|b.ipv4.dest[3])+6+m,
|
|
187
|
-
"application/dns-message"]],body:a.udp.data}).then(async c=>{c={eth:{ethertype:2048,src:b.router_mac,dest:a.eth.src},ipv4:{proto:17,src:b.router_ip,dest:a.ipv4.src},udp:{sport:53,dport:a.udp.sport,data:new Uint8Array(await c.arrayBuffer())}};b.receive(
|
|
188
|
-
ciaddr:0,yiaddr:
|
|
189
|
-
d.push(new Uint8Array([6,4].concat(a))));d.push(new Uint8Array([54,4].concat(a)));d.push(new Uint8Array([60,3].concat(
|
|
190
|
-
a.byteLength),
|
|
191
|
-
d)d=new DataView(e.buffer,e.byteOffset,e.byteLength),a={sport:d.getUint16(0),dport:d.getUint16(2),seq:d.getUint32(4),ackn:d.getUint32(8),doff:d.getUint8(12)>>4,winsize:d.getUint16(14),checksum:d.getUint16(16),urgent:d.getUint16(18)},d=d.getUint8(13),a.fin=!!(d&1),a.syn=!!(d&2),a.rst=!!(d&4),a.psh=!!(d&8),a.ack=!!(d&16),a.urg=!!(d&32),a.ece=!!(d&64),a.cwr=!!(d&128),c.tcp=a,c.tcp_data=e.subarray(4*a.doff);else if(17===
|
|
192
|
-
len:a.getUint16(4),checksum:a.getUint16(6),data:e.subarray(8),data_s:(new TextDecoder).decode(e.subarray(8))};if(67===a.dport||67===a.sport){e=e.subarray(8);d=new DataView(e.buffer,e.byteOffset,e.byteLength);e.subarray(44,236);d={op:d.getUint8(0),htype:d.getUint8(1),hlen:d.getUint8(2),hops:d.getUint8(3),xid:d.getUint32(4),secs:d.getUint16(8),flags:d.getUint16(10),ciaddr:d.getUint32(12),yiaddr:d.getUint32(16),
|
|
193
|
-
options:[]};e=e.subarray(240);for(m=0;m<e.length;++m)
|
|
194
|
-
ori_ts_i:d.getUint32(24),ori_ts_f:d.getUint32(28),rec_ts_i:d.getUint32(32),rec_ts_f:d.getUint32(36),trans_ts_i:d.getUint32(40),trans_ts_f:d.getUint32(44)});c.udp=a}}else 2054===d?(d=new DataView(a.buffer,a.byteOffset,a.byteLength),a={htype:d.getUint16(0),ptype:d.getUint16(2),oper:d.getUint16(6),sha:a.subarray(8,14),spa:a.subarray(14,18),tha:a.subarray(18,24),tpa:a.subarray(24,28)},c.arp=a):34525===d?
|
|
195
|
-
if(c.tcp.syn&&(b.tcp_conn[a]&&B("SYN to already opened port",16777216),b.on_tcp_connection(c,a)))break a;if(b.tcp_conn[a])b.tcp_conn[a].process(c);else{B(`I dont know about ${a}, so resetting`,16777216);a=c.tcp.ackn;if(c.tcp.fin||c.tcp.syn)a+=1;d={};d.eth={ethertype:2048,src:b.router_mac,dest:c.eth.src};d.ipv4={proto:6,src:c.ipv4.dest,
|
|
196
|
-
d))}}else if(c.udp)if(c.dns)if("static"===b.dns_method){a={};a.eth={ethertype:2048,src:b.router_mac,dest:c.eth.src};a.ipv4={proto:17,src:b.router_ip,dest:c.ipv4.src};a.udp={sport:53,dport:c.udp.sport};d=[];for(e=0;e<c.dns.questions.length;++e)switch(m=c.dns.questions[e],m.type){case 1:d.push({name:m.name,type:m.type,class:m.class,
|
|
197
|
-
(a=Date.now()+
|
|
198
|
-
a.ipv4={proto:17,src:c.ipv4.dest,dest:c.ipv4.src},a.udp={sport:c.udp.dport,dport:c.udp.sport,data:(new TextEncoder).encode(c.udp.data_s)},b.receive(
|
|
199
|
-
|
|
200
|
-
var f=d.getUint16(4);let
|
|
201
|
-
while(16383>++
|
|
202
|
-
this.in_active_close=!1;this.delayed_state=void 0;this.events_handlers={}}
|
|
203
|
-
function(a,b){a={sport:a.tcp.dport,dport:a.tcp.sport,winsize:a.tcp.winsize,ackn:this.ack,seq:this.seq};if(b)for(const c in b)a[c]=b[c];b=this.ipv4_reply();b.tcp=a;return b};
|
|
204
|
-
a.tcp.seq+1;this.start_seq=a.tcp.seq;this.hsrc=this.net.router_mac;this.psrc=a.ipv4.dest;this.sport=a.tcp.dport;this.hdest=a.eth.src;this.dport=a.tcp.sport;this.pdest=a.ipv4.src;this.winsize=a.tcp.winsize;let b=this.ipv4_reply();b.tcp={sport:this.sport,dport:this.dport,seq:1337,ackn:this.ack,winsize:a.tcp.winsize,syn:!0,ack:!0};
|
|
205
|
-
a));else if(a.tcp.rst){if("syn-probe"===this.state)this.emit("probe",!1);else this.on_close();this.release()}else if(a.tcp.syn){if("syn-sent"===this.state&&a.tcp.ack){this.ack=a.tcp.seq+1;this.start_seq=a.tcp.seq;this.last_received_ackn=a.tcp.ackn;var b=this.ipv4_reply();this.net.receive(
|
|
206
|
-
b)),this.release()):B(`TCP[${this.tuple}]: WARNING: unexpected SYN packet dropped`,16777216);a.tcp_data.length&&B(`TCP[${this.tuple}]: WARNING: ${a.tcp_data.length} bytes of unexpected SYN packet payload dropped`,16777216)}else{if(a.tcp.ack)if("syn-received"===this.state)this.state="established";else if("fin-wait-1"===
|
|
207
|
-
a.tcp.ackn;else if(b=a.tcp.ackn-this.last_received_ackn,0<b){if(this.last_received_ackn=a.tcp.ackn,this.send_buffer.remove(b),this.seq+=b,this.pending=!1,this.delayed_send_fin&&!this.send_buffer.length){this.delayed_send_fin=!1;this.state=this.delayed_state;a=this.ipv4_reply();a.tcp.fin=!0;this.net.receive(
|
|
208
|
-
{rst:!0});this.net.receive(
|
|
209
|
-
b.tcp.ack=!0):(this.release(),this.on_close(),b.tcp.rst=!0),this.net.receive(
|
|
210
|
-
b)),this.emit("data",a.tcp_data));this.pump()}};
|
|
211
|
-
16777216);this.release();return}this.send_buffer.length||this.pending?(this.delayed_send_fin=!0,this.delayed_state=a):(this.state=a,a=this.ipv4_reply(),a.tcp.fin=!0,this.net.receive(
|
|
212
|
-
|
|
213
|
-
"192.168.86.100").split(".").map(function(c){return parseInt(c,10)}));this.masquerade=void 0===b.masquerade||!!b.masquerade;this.vm_mac=new Uint8Array(6);this.dns_method=b.dns_method||"static";this.doh_server=b.doh_server;this.tcp_conn={};this.eth_encoder_buf=
|
|
214
|
-
function(c){this.send(c)},this)}
|
|
215
|
-
var b=this.read.substring(0,a).split(/\r\n/);a=this.read.substring(a+4);this.read="";let c=b[0].split(" "),d;d=/^https?:/.test(c[1])?new URL(c[1]):new URL("http://host"+c[1]);"undefined"!==typeof window&&"http:"===d.protocol&&"https:"===window.location.protocol&&(d.protocol="https:");
|
|
216
|
-
return}"host"===m.key.toLowerCase()?d.host=m.value:e.append(m.key,m.value)}if(!this.net.cors_proxy&&/^\d+\.external$/.test(d.hostname))if(B("Request to localhost: "+d.href,16777216),b=parseInt(d.hostname.split(".")[0],10),!isNaN(b)&&0<b&&65536>b)d.protocol=
|
|
217
|
-
16777216);this.name=d.href;b={method:c[0],headers:e};-1!==["put","post"].indexOf(b.method.toLowerCase())&&(b.body=a);const f=this.net.cors_proxy?this.net.cors_proxy+encodeURIComponent(d.href):d.href;new TextEncoder;let
|
|
218
|
-
this.write(this.net.form_response_head(
|
|
219
|
-
b){this.cors_proxy&&(a=this.cors_proxy+encodeURIComponent(a));try{const c=await fetch(a,b),d=await c.arrayBuffer();return[c,d]}catch(c){return console.warn("Fetch Failed: "+a+"\n"+c),[{status:502,statusText:"Fetch Error",headers:new Headers({"Content-Type":"text/plain"})},
|
|
220
|
-
"\r\n\r\n")};
|
|
221
|
-
value:b};B("Header value contains forbidden characters",16777216)}else B("Header key contains forbidden characters",16777216);else B("Unable to parse HTTP header",16777216)};
|
|
222
|
-
"52:54:0:1:2:3").split(":").map(function(d){return parseInt(d,16)}));this.router_ip=new Uint8Array((c.router_ip||"192.168.86.1").split(".").map(function(d){return parseInt(d,10)}));this.vm_ip=new Uint8Array((c.vm_ip||"192.168.86.100").split(".").map(function(d){return parseInt(d,
|
|
223
|
-
this.id+"-mac",function(d){this.vm_mac=new Uint8Array(d.split(":").map(function(e){return parseInt(e,16)}))},this);this.bus.register("net"+this.id+"-send",function(d){this.send(d)},this)}
|
|
224
|
-
function(a,b,c){this.connections[c]&&(0<this.connections[c].congestion?("DATA"===b&&this.connections[c].congestion--,this.wispws.send(a)):(this.connections[c].congested=!0,this.congested_buffer.push({data:a,type:b})))}
|
|
225
|
-
c);break;case 3:this.connections[c]&&(this.connections[c].congestion=b.getUint32(5,!0));if(this.connections[c].congested){for(const d of this.congested_buffer)this.send_packet(d.data,d.type,c);this.connections[c].congested=!1}break;case 4:this.connections[c]&&
|
|
226
|
-
function(a){let b,c;switch(a.type){case "CONNECT":const d=(new TextEncoder).encode(a.hostname);b=new Uint8Array(8+d.length);c=new DataView(b.buffer);c.setUint8(0,1);c.setUint32(1,a.stream_id,!0);c.setUint8(5,1);c.setUint16(6,a.port,!0);b.set(d,8);this.connections[a.stream_id]=
|
|
227
|
-
|
|
228
|
-
b;c.stream_id=this.last_stream++;this.tcp_conn[b]=c;c.on("data",d=>{0!==d.length&&this.send_wisp_frame({type:"DATA",stream_id:c.stream_id,data:d})});c.on_close=()=>{this.send_wisp_frame({type:"CLOSE",stream_id:c.stream_id,reason:2})};c.on_shutdown=c.on_close;this.send_wisp_frame({type:"CONNECT",
|
|
229
|
-
function(a){this.bus.send("net"+this.id+"-receive",new Uint8Array(a))};const
|
|
230
|
-
q[56]&&m(56,!1);return
|
|
231
|
-
(clearTimeout(t),x.getModifierState&&x.getModifierState("AltGraph")&&v===N&&"ControlLeft"===r.code&&"AltRight"===x.code||
|
|
232
|
-
(x|=128);255<x?(p(x>>8),p(x&255)):p(x)}function p(x){z.bus.send("keyboard-code",x)}var q={},r=null,v=!1,t=0,z=this;this.emu_enabled=!0;const A=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,
|
|
233
|
-
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]),u={8:8,10:13,32:32,39:222,44:188,
|
|
234
|
-
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},E={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,
|
|
235
|
-
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,
|
|
236
|
-
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,
|
|
237
|
-
function(){"undefined"!==typeof window&&(window.removeEventListener("keyup",c,!1),window.removeEventListener("keydown",d,!1),window.removeEventListener("blur",e,!1),window.removeEventListener("input",f,!1))};this.init=function(){"undefined"!==typeof window&&
|
|
238
|
-
this.simulate_char=function(x){var N=x.charCodeAt(0);N in u?this.simulate_press(u[N]):N in E?(p(42),this.simulate_press(E[N]),p(170)):console.log("ascii -> keyCode not found: ",N,x)}}function
|
|
239
|
-
v||r)A.bus.send("mouse-click",[!1,!1,!1]),q=v=r=!1}function f(u){if(A.bus&&c(u)&&A.is_running){var E=0,F=0,x=u.changedTouches;x?x.length&&(x=x[x.length-1],E=x.clientX-t,F=x.clientY-z,t=x.clientX,z=x.clientY,u.preventDefault()):"number"===typeof u.movementX?
|
|
240
|
-
[1*E,-(1*F)]);b&&A.bus.send("mouse-absolute",[u.pageX-b.offsetLeft,u.pageY-b.offsetTop,b.offsetWidth,b.offsetHeight])}}function
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
this.init()}function
|
|
244
|
-
function(){};this.update_buffer=function(){};this.get_text_screen=function(){for(var d=[],e=0;e<c;e++)d.push(this.get_text_row(e));return d};this.get_text_row=function(d){d*=b;return String.fromCharCode.apply(String,a.subarray(d,d+b))};this.set_size_text(80,25)}function
|
|
245
|
-
|
|
246
|
-
f,!1)};this.init=function(){this.destroy();a.style.display="block";a.addEventListener("keypress",c,!1);a.addEventListener("keydown",d,!1);a.addEventListener("paste",e,!1);window.addEventListener("mousedown",f,!1)};this.init();this.show_char=function(
|
|
247
|
-
{this.update_timer=void 0;var p=Date.now();
|
|
248
|
-
convertEol:"true"});c.write("This is the serial console. Whatever you type or paste here will be sent to COM1");var d=c.onData(function(e){for(let f=0;f<e.length;f++)b.send("serial0-input",e.charCodeAt(f))});b.register("serial0-output-byte",function(e){c.write(Uint8Array.of(e))},this);this.destroy=function(){d.dispose();
|
|
249
|
-
this.channel=new BroadcastChannel(`v86-inbrowser-${b}`);this.is_open=!0;this.nic_to_hub_fn=c=>{this.channel.postMessage(c)};this.bus.register(this.bus_send_msgid,this.nic_to_hub_fn,this);this.hub_to_nic_fn=c=>{this.bus.send(this.bus_recv_msgid,c.data)};this.channel.addEventListener("message",this.hub_to_nic_fn)}
|
|
250
|
-
this.is_open=!1)};function
|
|
251
|
-
(b+="/");this.storage=a;this.baseurl=b}
|
|
252
|
-
function J(a,b,c,d){for(var e,f=0,
|
|
253
|
-
case "Q":J(["b","w","d"],[e.type,e.version,e.path],c,d);d+=13;f+=13;break;default:B("Marshall: Unknown type="+a[
|
|
254
|
-
h;e.push(
|
|
255
|
-
a[2]=[];for(const [b,c]of Object.entries(this.inodedata))0===(this.inodes[b].mode&16384)&&a[2].push([b,c]);a[3]=this.total_size;a[4]=this.used_size;return a=a.concat(this.mounts)};L.prototype.set_state=function(a){this.inodes=a[0].map(b=>{const c=new
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
this.
|
|
264
|
-
|
|
265
|
-
f);this.
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
e.foreign_id,a=this.follow_fs(
|
|
269
|
-
d.
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
this.
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
function(a
|
|
297
|
-
function(a,b
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
{
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
b.
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
O.prototype.
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
function(a){for(var
|
|
327
|
-
a.msRequestFullScreen;b&&(b.call(a),(a=document.getElementsByClassName("phone_keyboard")[0])&&a.focus());try{navigator.keyboard.lock()}catch(c){}this.lock_mouse()}}};O.prototype.lock_mouse=async function(){const a=document.body;try{await a.requestPointerLock({unadjustedMovement:!0})}catch(b){await a.requestPointerLock()}};O.prototype.mouse_set_enabled=function(a){this.mouse_adapter&&(this.mouse_adapter.emu_enabled=
|
|
328
|
-
function(a){this.keyboard_adapter&&(this.keyboard_adapter.emu_enabled=a)};O.prototype.keyboard_set_status=O.prototype.keyboard_set_enabled;O.prototype.serial0_send=function(a){for(var b=0;b<a.length;b++)this.bus.send("serial0-input",a.charCodeAt(b))};O.prototype.serial_send_bytes=function(a,b){for(var c=0;c<b.length;c++)this.bus.send("serial"+a+"-input",b[c])};O.prototype.serial_set_modem_status=function(a,
|
|
329
|
-
function(a,b){this.bus.send("serial"+a+"-carrier-detect-input",b)};O.prototype.serial_set_ring_indicator=function(a,b){this.bus.send("serial"+a+"-ring-indicator-input",b)};O.prototype.serial_set_data_set_ready=function(a,b){this.bus.send("serial"+a+"-data-set-ready-input",b)};O.prototype.serial_set_clear_to_send=function(a,b){this.bus.send("serial"+a+"-clear-to-send-input",b)};O.prototype.
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
function(){}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
this.
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
0,
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
b
|
|
354
|
-
this.
|
|
355
|
-
a
|
|
356
|
-
|
|
357
|
-
a
|
|
358
|
-
this.
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
this.
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
c
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
function(
|
|
378
|
-
|
|
379
|
-
this
|
|
380
|
-
|
|
381
|
-
this.
|
|
382
|
-
|
|
383
|
-
function(){
|
|
384
|
-
|
|
385
|
-
0,
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
n(
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
(
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
a[
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
this.
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
Fc(
|
|
418
|
-
|
|
419
|
-
this.
|
|
420
|
-
this.
|
|
421
|
-
this.
|
|
422
|
-
this.
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
this.
|
|
432
|
-
this.
|
|
433
|
-
|
|
434
|
-
this.
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
this.
|
|
439
|
-
this.
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
!
|
|
446
|
-
this.
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
function(){const a=[
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
function(a){this.
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
a
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
a
|
|
480
|
-
this.
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
this.
|
|
485
|
-
this.
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
this.
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
this.
|
|
508
|
-
!1;this.set_disk_buffer(c);this.drive_connected&&B(`${this.name}: ${this.is_atapi?"ATAPI CD-ROM":"ATA HD"} device ready`,32768);Object.seal(this)}X.prototype.has_disk=function(){return!!this.buffer};X.prototype.eject=function(){this.is_atapi&&this.buffer&&(this.medium_changed=!0,this.buffer=null,this.status_reg=89,this.error_reg=96,this.push_irq())};X.prototype.set_cdrom=function(a){this.is_atapi&&a&&(this.set_disk_buffer(a),this.medium_changed=!0)};X.prototype.set_disk_buffer=function(a){if(a){this.buffer=
|
|
509
|
-
a;this.is_atapi&&(this.status_reg=89,this.error_reg=96);this.sector_count=this.buffer.byteLength/this.sector_size;this.sector_count!==(this.sector_count|0)&&(B(this.name+": warning: disk size not aligned with sector size",32768),this.sector_count=Math.ceil(this.sector_count));this.is_atapi?(this.head_count=1,this.sectors_per_track=2048):(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!==(this.cylinder_count|
|
|
510
|
-
0)&&(B(this.name+": warning: rounding up cylinder count, choose different head number",32768),this.cylinder_count=Math.floor(this.cylinder_count));if(0===this.interface_nr){a=this.cpu.devices.rtc;a.cmos_write(57,a.cmos_read(57)|1<<4*this.channel_nr);a.cmos_write(18,a.cmos_read(18)&15|240);const b=0===this.channel_nr?27:36;a.cmos_write(b+0,this.cylinder_count&255);a.cmos_write(b+1,this.cylinder_count>>8&255);a.cmos_write(b+2,this.head_count&255);a.cmos_write(b+3,255);a.cmos_write(b+4,255);a.cmos_write(b+
|
|
511
|
-
5,200);a.cmos_write(b+6,this.cylinder_count&255);a.cmos_write(b+7,this.cylinder_count>>8&255);a.cmos_write(b+8,this.sectors_per_track&255)}this.channel.cpu&&this.push_irq()}};X.prototype.device_reset=function(){this.is_atapi?(this.status_reg=0,this.lba_low_reg=this.error_reg=this.sector_count_reg=1,this.lba_mid_reg=20,this.lba_high_reg=235):(this.status_reg=81,this.lba_low_reg=this.error_reg=this.sector_count_reg=1,this.lba_high_reg=this.lba_mid_reg=0);this.cancel_io_operations()};X.prototype.push_irq=
|
|
512
|
-
function(){this.channel.push_irq()};X.prototype.ata_abort_command=function(){this.error_reg=4;this.status_reg=65;this.push_irq()};X.prototype.capture_regs=function(){return`ST=${n(this.status_reg&255)} ER=${n(this.error_reg&255)} `+`SC=${n(this.sector_count_reg&255)} LL=${n(this.lba_low_reg&255)} `+`LM=${n(this.lba_mid_reg&255)} LH=${n(this.lba_high_reg&255)} `+`FE=${n(this.features_reg&255)}`};X.prototype.ata_command=function(a){if(this.drive_connected||144===a){var b=this.capture_regs(),c=!0;this.current_command=
|
|
513
|
-
a;this.error_reg=0;switch(a){case 8:this.data_length=this.data_end=this.data_pointer=0;this.device_reset();this.push_irq();break;case 16:this.lba_mid_reg=0;this.status_reg=80;this.push_irq();break;case 248:var d=this.sector_count-1;this.lba_low_reg=d&255;this.lba_mid_reg=d>>8&255;this.lba_high_reg=d>>16&255;this.device_reg=this.device_reg&240|d>>24&15;this.status_reg=80;this.push_irq();break;case 39:d=this.sector_count-1;this.lba_low_reg=d&255;this.lba_mid_reg=d>>8&255;this.lba_high_reg=d>>16&255;
|
|
514
|
-
this.lba_low_reg|=d>>24<<8&65280;this.status_reg=80;this.push_irq();break;case 32:c=!1;this.is_atapi?(this.lba_mid_reg=20,this.lba_high_reg=235,this.ata_abort_command()):this.ata_read_sectors(a);break;case 36:case 41:case 196:c=!1;this.is_atapi?this.ata_abort_command():this.ata_read_sectors(a);break;case 48:case 52:case 57:case 197:c=!1;this.is_atapi?this.ata_abort_command():this.ata_write_sectors(a);break;case 144:this.channel.master.status_reg=80;this.channel.master.error_reg=1;this.channel.master.push_irq();
|
|
515
|
-
this.channel.slave.drive_connected&&(this.channel.slave.status_reg=80,this.channel.slave.error_reg=1,this.channel.slave.push_irq());break;case 145:this.status_reg=80;this.push_irq();break;case 160:this.is_atapi?(c=!1,this.data_allocate(12),this.data_end=12,this.sector_count_reg=1,this.status_reg=88,this.push_irq()):this.ata_abort_command();break;case 161:this.is_atapi?(this.create_identify_packet(),this.status_reg=88,this.push_irq()):this.ata_abort_command();break;case 198:B(this.name+": logical sectors per DRQ Block: "+
|
|
516
|
-
n(this.sector_count_reg&255),32768);this.sectors_per_drq=this.sector_count_reg&255;this.status_reg=80;this.push_irq();break;case 200:case 37:c=!1;this.ata_read_sectors_dma(a);break;case 202:case 53:c=!1;this.ata_write_sectors_dma(a);break;case 64:this.status_reg=80;this.push_irq();break;case 218:this.is_atapi&&(this.buffer||(this.error_reg|=2),this.medium_changed&&(this.error_reg|=32,this.medium_changed=!1),this.error_reg|=64);this.status_reg=80;this.push_irq();break;case 224:this.status_reg=80;this.push_irq();
|
|
517
|
-
break;case 225:this.status_reg=80;this.push_irq();break;case 231:this.status_reg=80;this.push_irq();break;case 234:this.status_reg=80;this.push_irq();break;case 236:this.is_atapi?(this.lba_mid_reg=20,this.lba_high_reg=235,this.ata_abort_command()):(this.create_identify_packet(),this.status_reg=88,this.push_irq());break;case 239:this.status_reg=80;this.push_irq();break;case 222:this.status_reg=64;this.push_irq();break;case 245:this.status_reg=80;this.push_irq();break;case 249:this.ata_abort_command();
|
|
518
|
-
break;case 0:this.ata_abort_command();break;default:k(!1,`${this.name}: error: unimplemented ATA command ${n(a)}: ABORT [${this.capture_regs()}]`,32768),this.ata_abort_command()}c&&(b=`[${b}] -> [${this.capture_regs()}]`,c=this.status_reg&1?this.error_reg&4?"ABORT":"ERROR":"OK",B(`${this.name}: ATA command ${Wc[a]} (${n(a)}): ${c} ${b}`,32768))}else B(`${this.name}: ATA command ${Wc[a]} (${n(a)}) ignored: no slave drive connected`,32768)};X.prototype.atapi_handle=function(){const a=this.data[0],b=
|
|
519
|
-
Xc[a]?Xc[a].name:"<undefined>";var c=Xc[a]?Xc[a].flags:0,d=this.capture_regs(),e=!0;let f;this.data_pointer=0;this.current_atapi_command=a;3!==a&&(this.atapi_add_sense=this.atapi_sense_key=0);if(!this.buffer&&c&1)this.atapi_check_condition_response(2,58),this.push_irq(),B(`${this.name}: ATAPI command ${b} (${n(a)}) without medium: ERROR [${d}]`,32768);else{switch(a){case 0:this.buffer?(this.data_allocate(0),this.data_end=this.data_length,this.status_reg=80):this.atapi_check_condition_response(2,58);
|
|
520
|
-
break;case 3:this.data_allocate(this.data[4]);this.data_end=this.data_length;this.status_reg=88;this.data[0]=240;this.data[2]=this.atapi_sense_key;this.data[7]=8;this.data[12]=this.atapi_add_sense;this.atapi_add_sense=this.atapi_sense_key=0;break;case 18:c=this.data[4];this.status_reg=88;f="lun="+n(this.data[1],2)+" length="+c;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,c);break;
|
|
521
|
-
case 26:this.data_allocate(this.data[4]);this.data_end=this.data_length;this.status_reg=88;break;case 30:this.data_allocate(0);this.data_end=this.data_length;this.status_reg=80;break;case 37:c=this.sector_count-1;this.data_set(new Uint8Array([c>>24&255,c>>16&255,c>>8&255,c&255,0,0,this.sector_size>>8&255,this.sector_size&255]));this.data_end=this.data_length;this.status_reg=88;break;case 40:e=!1;this.features_reg&1?this.atapi_read_dma(this.data):this.atapi_read(this.data);break;case 66:c=this.data[8];
|
|
522
|
-
f="length="+c;this.data_allocate(Math.min(8,c));this.data_end=this.data_length;this.status_reg=88;break;case 67:c=this.data[8]|this.data[7]<<8;var h=this.data[9]>>6;f=`${n(h,2)} length=${c} ${!!(this.data[1]&2)} ${n(this.data[6])}`;this.data_allocate(c);this.data_end=this.data_length;0===h?(c=this.sector_count,this.data.set(new Uint8Array([0,18,1,1,0,20,1,0,0,0,0,0,0,22,170,0,c>>24,c>>16&255,c>>8&255,c&255]))):1===h?this.data.set(new Uint8Array([0,10,1,1,0,0,0,0,0,0,0,0])):k(!1,this.name+": error: unimplemented format: "+
|
|
523
|
-
h);this.status_reg=88;break;case 70:c=Math.min(this.data[8]|this.data[7]<<8,32);f="length="+c;this.data_allocate(c);this.data_end=this.data_length;this.data[0]=c-4>>24&255;this.data[1]=c-4>>16&255;this.data[2]=c-4>>8&255;this.data[3]=c-4&255;this.data[6]=8;this.data[10]=3;this.status_reg=88;break;case 81:this.data_allocate(0);this.data_end=this.data_length;this.status_reg=80;break;case 82:f="unimplemented";this.atapi_check_condition_response(5,36);break;case 90:c=this.data[8]|this.data[7]<<8;h=this.data[2];
|
|
524
|
-
f="page_code="+n(h)+" length="+c;42===h&&this.data_allocate(Math.min(30,c));this.data_end=this.data_length;this.status_reg=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_reg=88;break;case 27:c=this.data[4]&3;f=`Immed=${n(this.data[1]&1)} LoEj/Start=${n(c)}`;this.buffer&&2===c&&(f+=": disk ejected",this.medium_changed=!0,this.buffer=null);this.status_reg=80;this.data_allocate(0);this.data_end=this.data_length;break;case 69:case 74:f=
|
|
525
|
-
"unimplemented";this.atapi_check_condition_response(5,36);break;case 190:f="unimplemented";this.data_allocate(0);this.data_end=this.data_length;this.status_reg=80;break;default:k(!1,`${this.name}: error: unimplemented ATAPI command ${n(this.data[0])}`,32768),this.atapi_check_condition_response(5,36)}this.sector_count_reg=this.sector_count_reg&-8|2;0===(this.status_reg&128)&&this.push_irq();0===(this.status_reg&128)&&0===this.data_length&&(this.sector_count_reg|=1,this.status_reg&=-9);e&&(d=`[${d}] -> [${this.capture_regs()}]`,
|
|
526
|
-
e=this.status_reg&1?this.error_reg&4?"ABORT":"ERROR":"OK",f=f?` ${f}:`:"",B(`${this.name}: ATAPI command ${b} (${n(a)}):${f} ${e} ${d}`,32768))}};X.prototype.atapi_check_condition_response=function(a,b){this.data_allocate(0);this.data_end=this.data_length;this.status_reg=65;this.error_reg=a<<4;this.sector_count_reg=this.sector_count_reg&-8|3;this.atapi_sense_key=a;this.atapi_add_sense=b};X.prototype.do_write=function(){this.status_reg=80;k(this.data_length<=this.data.length);var a=this.data.subarray(0,
|
|
527
|
-
this.data_length);k(0===this.data_length%512);this.ata_advance(this.current_command,this.data_length/512);this.push_irq();this.buffer.set(this.write_dest,a,function(){});this.report_write(this.data_length)};X.prototype.atapi_read=function(a){var b=(a[7]<<8|a[8])*this.sector_size;a=(a[2]<<24|a[3]<<16|a[4]<<8|a[5])*this.sector_size;this.data_length=0;var c=this.lba_high_reg<<8&65280|this.lba_mid_reg&255;this.lba_mid_reg=this.lba_high_reg=0;65535===c&&c--;c>b&&(c=b);this.buffer?a>=this.buffer.byteLength?
|
|
528
|
-
(k(!1,this.name+": CD read: Outside of disk end="+n(a+b)+" size="+n(this.buffer.byteLength),32768),this.status_reg=255,this.push_irq()):0===b?(this.status_reg=80,this.data_pointer=0):(b=Math.min(b,this.buffer.byteLength-a),this.status_reg=208,this.report_read_start(),this.read_buffer(a,b,d=>{this.data_set(d);this.status_reg=88;this.sector_count_reg=this.sector_count_reg&-8|2;this.push_irq();this.data_end=c&=-4;this.data_end>this.data_length&&(this.data_end=this.data_length);this.lba_mid_reg=this.data_end&
|
|
529
|
-
255;this.lba_high_reg=this.data_end>>8&255;this.report_read_end(b)})):(k(!1,this.name+": CD read: no buffer",32768),this.status_reg=255,this.error_reg=65,this.push_irq())};X.prototype.atapi_read_dma=function(a){var b=a[2]<<24|a[3]<<16|a[4]<<8|a[5],c=a[7]<<8|a[8];a=a[1];var d=c*this.sector_size,e=b*this.sector_size;B(this.name+": CD read DMA lba="+n(b)+" lbacount="+n(c)+" bytecount="+n(d)+" flags="+n(a),32768);e>=this.buffer.byteLength?(k(!1,this.name+": CD read: Outside of disk end="+n(e+d)+" size="+
|
|
115
|
+
1:2;var e=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;for(var f=0,g=0;g<a;g++)for(var k=Ta(e[g]/b+c,-1,1),m=0;m<d;m++)this.dac_buffers[f].push(k),f^=1;this.dac_send()};D.prototype.dac_handle_request=function(){!this.dma_bytes_left||this.dma_paused?this.dac_send():this.dma_transfer_next()};D.prototype.dac_send=function(){if(this.dac_buffers[0].length){var a=this.dac_buffers[0].shift_block(this.dac_buffers[0].length),
|
|
116
|
+
b=this.dac_buffers[1].shift_block(this.dac_buffers[1].length);this.bus.send("dac-send-data",[a,b],[a.buffer,b.buffer])}};D.prototype.raise_irq=function(a){B("raise irq",8388608);this.irq_triggered[a]=1;this.cpu.device_raise_irq(this.irq)};D.prototype.lower_irq=function(a){B("lower irq",8388608);this.irq_triggered[a]=0;this.cpu.device_lower_irq(this.irq)};function Ta(a,b,c){return(a<b)*b+(a>c)*c+(b<=a&&a<=c)*a}function cb(a){this.message=a}cb.prototype=Error();const db={Uint8Array,Int8Array,Uint16Array,
|
|
117
|
+
Int16Array,Uint32Array,Int32Array,Float32Array,Float64Array};function eb(a,b){if("object"!==typeof a||null===a)return l("function"!==typeof a),a;if(Array.isArray(a))return a.map(f=>eb(f,b));a.constructor===Object&&(console.log(a),l(a.constructor!==Object,"Expected non-object"));if(a.BYTES_PER_ELEMENT){var c=new Uint8Array(a.buffer,a.byteOffset,a.length*a.BYTES_PER_ELEMENT);a=a.constructor.name.replace("bound ","");l(db[a]);return{__state_type__:a,buffer_id:b.push(c)-1}}!a.get_state&&console.log("Object without get_state: ",
|
|
118
|
+
a);c=a.get_state();a=[];for(var d=0;d<c.length;d++){var e=c[d];l("function"!==typeof e);a[d]=eb(e,b)}return a}function fb(a,b){if("object"!==typeof a||null===a)return l("function"!==typeof a),a;if(Array.isArray(a)){for(var c=0;c<a.length;c++)a[c]=fb(a[c],b);return a}c=a.__state_type__;l(void 0!==c);const d=db[c];l(d,"Unkown type: "+c);return new d(b[a.buffer_id])}function gb(a,b){function c(t,z){const A=t.length;if(16>A)throw new cb("Invalid length: "+A);t=new Int32Array(t.buffer,t.byteOffset,4);
|
|
119
|
+
if(-2039052682!==t[0])throw new cb("Invalid header: "+n(t[0]>>>0));if(6!==t[1])throw new cb("Version mismatch: dump="+t[1]+" we=6");if(z&&t[2]!==A)throw new cb("Length doesn't match header: real="+A+" header="+t[2]);return t[3]}function d(t){t=(new TextDecoder).decode(t);return JSON.parse(t)}b=new Uint8Array(b);if(4247762216===(new Uint32Array(b.buffer,0,1))[0]){var e=a.zstd_create_ctx(b.length);(new Uint8Array(a.wasm_memory.buffer,a.zstd_get_src_ptr(e),b.length)).set(b);var f=a.zstd_read(e,16),g=
|
|
120
|
+
new Uint8Array(a.wasm_memory.buffer,f,16),k=c(g,!1);a.zstd_read_free(f,16);f=a.zstd_read(e,k);g=new Uint8Array(a.wasm_memory.buffer,f,k);g=d(g);a.zstd_read_free(f,k);f=g.state;var m=g.buffer_infos;g=[];k=16+k;for(var p of m){m=(k+3&-4)-k;if(1048576<p.length){var q=a.zstd_read(e,m);a.zstd_read_free(q,m);q=new Uint8Array(p.length);g.push(q.buffer);for(var r=0;r<p.length;){var v=p.length-r;l(0<=v);v=Math.min(v,1048576);const t=a.zstd_read(e,v);q.set(new Uint8Array(a.wasm_memory.buffer,t,v),r);a.zstd_read_free(t,
|
|
121
|
+
v);r+=v}}else q=a.zstd_read(e,m+p.length),r=q+m,g.push(a.wasm_memory.buffer.slice(r,r+p.length)),a.zstd_read_free(q,m+p.length);k+=m+p.length}f=fb(f,g);a.set_state(f);a.zstd_free_ctx(e)}else{e=c(b,!0);if(0>e||e+12>=b.length)throw new cb("Invalid info block length: "+e);p=b.subarray(16,16+e);f=d(p);p=f.state;f=f.buffer_infos;let t=16+e;t=t+3&-4;e=f.map(z=>{const A=t+z.offset;return b.buffer.slice(A,A+z.length)});p=fb(p,e);a.set_state(p)}}function hb(a,b,c,d,e){let f="";var g=[],k=b?"compiled":c?"jit exit":
|
|
122
|
+
d?"unguarded register":e?"wasm size":"executed";for(let q=0;256>q;q++)for(let r=0;8>r;r++)for(const v of[!1,!0]){var m=a.wm.exports.get_opstats_buffer(b,c,d,e,q,!1,v,r);g.push({opcode:q,count:m,is_mem:v,fixed_g:r});m=a.wm.exports.get_opstats_buffer(b,c,d,e,q,!0,v,r);g.push({opcode:3840|q,count:m,is_mem:v,fixed_g:r})}a=0;b=new Set([38,46,54,62,100,101,102,103,240,242,243]);for(const {count:q,opcode:r}of g)b.has(r)||(a+=q);if(0===a)return"";c=new Uint32Array(256);b=new Uint32Array(256);for(const {opcode:q,
|
|
123
|
+
count:r}of g)3840===(q&65280)?b[q&255]+=r:c[q&255]+=r;f=f+"------------------\nTotal: "+(a+"\n");const p=1E7<a?1E3:1;d=Math.max.apply(Math,g.map(({count:q})=>Math.round(q/p)));d=String(d).length;f+=`Instruction counts ${k} (in ${p}):\n`;for(e=0;256>e;e++)f+=e.toString(16).padStart(2,"0")+":"+ca(Math.round(c[e]/p),d),f=15===e%16?f+"\n":f+" ";f=f+"\n"+`Instruction counts ${k} (0f, in ${p}):\n`;for(k=0;256>k;k++)f+=(k&255).toString(16).padStart(2,"0")+":"+ca(Math.round(b[k]/p),d),f=15===k%16?f+"\n":
|
|
124
|
+
f+" ";f+="\n";g=g.filter(({count:q})=>q).sort(({count:q},{count:r})=>r-q);for(const {opcode:q,is_mem:r,fixed_g:v,count:t}of g.slice(0,200))g=q.toString(16)+"_"+v+(r?"_m":"_r"),f+=g+":"+(t/a*100).toFixed(2)+" ";return f+"\n"}function jb(a){this.cpu=a;this.cmos_index=0;this.cmos_data=new Uint8Array(128);this.last_update=this.rtc_time=Date.now();this.next_interrupt_alarm=this.next_interrupt=0;this.periodic_interrupt=!1;this.periodic_interrupt_time=.9765625;this.cmos_a=38;this.cmos_b=2;this.nmi_disabled=
|
|
125
|
+
this.cmos_diag_status=this.cmos_c=0;this.update_interrupt=!1;this.update_interrupt_time=0;a.io.register_write(112,this,function(b){this.cmos_index=b&127;this.nmi_disabled=b>>7});a.io.register_write(113,this,this.cmos_port_write);a.io.register_read(113,this,this.cmos_port_read)}jb.prototype.get_state=function(){var a=[];a[0]=this.cmos_index;a[1]=this.cmos_data;a[2]=this.rtc_time;a[3]=this.last_update;a[4]=this.next_interrupt;a[5]=this.next_interrupt_alarm;a[6]=this.periodic_interrupt;a[7]=this.periodic_interrupt_time;
|
|
126
|
+
a[8]=this.cmos_a;a[9]=this.cmos_b;a[10]=this.cmos_c;a[11]=this.nmi_disabled;a[12]=this.update_interrupt;a[13]=this.update_interrupt_time;a[14]=this.cmos_diag_status;return a};jb.prototype.set_state=function(a){this.cmos_index=a[0];this.cmos_data=a[1];this.rtc_time=a[2];this.last_update=a[3];this.next_interrupt=a[4];this.next_interrupt_alarm=a[5];this.periodic_interrupt=a[6];this.periodic_interrupt_time=a[7];this.cmos_a=a[8];this.cmos_b=a[9];this.cmos_c=a[10];this.nmi_disabled=a[11];this.update_interrupt=
|
|
127
|
+
a[12]||!1;this.update_interrupt_time=a[13]||0;this.cmos_diag_status=a[14]||0};jb.prototype.timer=function(a){a=Date.now();this.rtc_time+=a-this.last_update;this.last_update=a;this.periodic_interrupt&&this.next_interrupt<a?(this.cpu.device_raise_irq(8),this.cmos_c|=192,this.next_interrupt+=this.periodic_interrupt_time*Math.ceil((a-this.next_interrupt)/this.periodic_interrupt_time)):this.next_interrupt_alarm&&this.next_interrupt_alarm<a?(this.cpu.device_raise_irq(8),this.cmos_c|=160,this.next_interrupt_alarm=
|
|
128
|
+
0):this.update_interrupt&&this.update_interrupt_time<a&&(this.cpu.device_raise_irq(8),this.cmos_c|=144,this.update_interrupt_time=a+1E3);let b=100;this.periodic_interrupt&&this.next_interrupt&&(b=Math.min(b,Math.max(0,this.next_interrupt-a)));this.next_interrupt_alarm&&(b=Math.min(b,Math.max(0,this.next_interrupt_alarm-a)));this.update_interrupt&&(b=Math.min(b,Math.max(0,this.update_interrupt_time-a)));return b};jb.prototype.bcd_pack=function(a){for(var b=0,c=0,d;a;)d=a%10,c|=d<<4*b,b++,a=(a-d)/10;
|
|
129
|
+
return c};jb.prototype.bcd_unpack=function(a){const b=a&15,c=a>>4&15;l(256>a);l(10>b);l(10>c);return b+10*c};jb.prototype.encode_time=function(a){return this.cmos_b&4?a:this.bcd_pack(a)};jb.prototype.decode_time=function(a){return this.cmos_b&4?a:this.bcd_unpack(a)};jb.prototype.cmos_port_read=function(){var a=this.cmos_index;switch(a){case 0:return B("read second: "+n(this.encode_time((new Date(this.rtc_time)).getUTCSeconds())),65536),this.encode_time((new Date(this.rtc_time)).getUTCSeconds());case 2:return B("read minute: "+
|
|
130
|
+
n(this.encode_time((new Date(this.rtc_time)).getUTCMinutes())),65536),this.encode_time((new Date(this.rtc_time)).getUTCMinutes());case 4:return B("read hour: "+n(this.encode_time((new Date(this.rtc_time)).getUTCHours())),65536),this.encode_time((new Date(this.rtc_time)).getUTCHours());case 6:return B("read day: "+n(this.encode_time((new Date(this.rtc_time)).getUTCDay()+1)),65536),this.encode_time((new Date(this.rtc_time)).getUTCDay()+1);case 7:return B("read day of month: "+n(this.encode_time((new Date(this.rtc_time)).getUTCDate())),
|
|
131
|
+
65536),this.encode_time((new Date(this.rtc_time)).getUTCDate());case 8:return B("read month: "+n(this.encode_time((new Date(this.rtc_time)).getUTCMonth()+1)),65536),this.encode_time((new Date(this.rtc_time)).getUTCMonth()+1);case 9:return B("read year: "+n(this.encode_time((new Date(this.rtc_time)).getUTCFullYear()%100)),65536),this.encode_time((new Date(this.rtc_time)).getUTCFullYear()%100);case 10:return 999<=I.microtick()%1E3?this.cmos_a|128:this.cmos_a;case 11:return this.cmos_b;case 12:return this.cpu.device_lower_irq(8),
|
|
132
|
+
B("cmos reg C read",65536),a=this.cmos_c,this.cmos_c&=-241,a;case 13:return 128;case 14:return B("cmos diagnostic status read",65536),this.cmos_diag_status;case 50:case 55:return B("read century: "+n(this.encode_time((new Date(this.rtc_time)).getUTCFullYear()/100|0)),65536),this.encode_time((new Date(this.rtc_time)).getUTCFullYear()/100|0);default:return B("cmos read from index "+n(a),65536),this.cmos_data[this.cmos_index]}};jb.prototype.cmos_port_write=function(a){switch(this.cmos_index){case 10:this.cmos_a=
|
|
133
|
+
a&127;this.periodic_interrupt_time=1E3/(32768>>(this.cmos_a&15)-1);B("Periodic interrupt, a="+n(this.cmos_a,2)+" t="+this.periodic_interrupt_time,65536);break;case 11:this.cmos_b=a;this.cmos_b&128&&(this.cmos_b&=239);this.cmos_b&64&&(this.next_interrupt=Date.now());if(this.cmos_b&32){a=new Date;const b=this.decode_time(this.cmos_data[1]),c=this.decode_time(this.cmos_data[3]),d=this.decode_time(this.cmos_data[5]),e=new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate(),d,c,b));B("RTC alarm scheduled for "+
|
|
134
|
+
e+" hh:mm:ss="+d+":"+c+":"+b+" ms_from_now="+(e-a),65536);this.next_interrupt_alarm=+e}this.cmos_b&16&&(B("update interrupt",65536),this.update_interrupt_time=Date.now());B("cmos b="+n(this.cmos_b,2),65536);break;case 14:this.cmos_diag_status=a;break;case 1:case 3:case 5:this.cmos_write(this.cmos_index,a);break;default:B("cmos write index "+n(this.cmos_index)+": "+n(a),65536)}this.update_interrupt=16===(this.cmos_b&16)&&0<(this.cmos_a&15);this.periodic_interrupt=64===(this.cmos_b&64)&&0<(this.cmos_a&
|
|
135
|
+
15)};jb.prototype.cmos_read=function(a){l(128>a);return this.cmos_data[a]};jb.prototype.cmos_write=function(a,b){B("cmos "+n(a)+" <- "+n(b),65536);l(128>a);this.cmos_data[a]=b};function kb(a,b){this.cpu=a;this.bus=b;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=
|
|
136
|
+
new Uint16Array(3);this.counter_reload=new Uint16Array(3);a.io.register_read(97,this,function(){var c=I.microtick(),d=66.66666666666667*c&1;c=this.did_rollover(2,c);return d<<4|c<<5});a.io.register_write(97,this,function(c){c&1?this.bus.send("pcspeaker-enable"):this.bus.send("pcspeaker-disable")});a.io.register_read(64,this,function(){return this.counter_read(0)});a.io.register_read(65,this,function(){return this.counter_read(1)});a.io.register_read(66,this,function(){return this.counter_read(2)});
|
|
137
|
+
a.io.register_write(64,this,function(c){this.counter_write(0,c)});a.io.register_write(65,this,function(c){this.counter_write(1,c)});a.io.register_write(66,this,function(c){this.counter_write(2,c);this.bus.send("pcspeaker-update",[this.counter_mode[2],this.counter_reload[2]])});a.io.register_write(67,this,this.port43_write)}kb.prototype.get_state=function(){var a=[];a[0]=this.counter_next_low;a[1]=this.counter_enabled;a[2]=this.counter_mode;a[3]=this.counter_read_mode;a[4]=this.counter_latch;a[5]=
|
|
138
|
+
this.counter_latch_value;a[6]=this.counter_reload;a[7]=this.counter_start_time;a[8]=this.counter_start_value;return a};kb.prototype.set_state=function(a){this.counter_next_low=a[0];this.counter_enabled=a[1];this.counter_mode=a[2];this.counter_read_mode=a[3];this.counter_latch=a[4];this.counter_latch_value=a[5];this.counter_reload=a[6];this.counter_start_time=a[7];this.counter_start_value=a[8]};kb.prototype.timer=function(a,b){var c=100;b||(this.counter_enabled[0]&&this.did_rollover(0,a)?(this.counter_start_value[0]=
|
|
139
|
+
this.get_counter_value(0,a),this.counter_start_time[0]=a,B("pit interrupt. new value: "+this.counter_start_value[0],512),this.cpu.device_lower_irq(0),this.cpu.device_raise_irq(0),0===this.counter_mode[0]&&(this.counter_enabled[0]=0)):this.cpu.device_lower_irq(0),this.counter_enabled[0]&&(c=(this.counter_start_value[0]-Math.floor(1193.1816666*(a-this.counter_start_time[0])))/1193.1816666));return c};kb.prototype.get_counter_value=function(a,b){if(!this.counter_enabled[a])return 0;var c=b-this.counter_start_time[a],
|
|
140
|
+
d=Math.floor(1193.1816666*c);b=this.counter_start_value[a]-d;B("diff="+c+" dticks="+d+" value="+b+" reload="+this.counter_reload[a],512);c=this.counter_reload[a];b>=c?(B("Warning: Counter"+a+" value "+b+" is larger than reload "+c,512),b%=c):0>b&&(b=b%c+c);return b};kb.prototype.did_rollover=function(a,b){b-=this.counter_start_time[a];return 0>b?(B("Warning: PIT timer difference is negative, resetting (timer "+a+")"),!0):this.counter_start_value[a]<Math.floor(1193.1816666*b)};kb.prototype.counter_read=
|
|
141
|
+
function(a){var b=this.counter_latch[a];if(b)return this.counter_latch[a]--,2===b?this.counter_latch_value[a]&255:this.counter_latch_value[a]>>8;b=this.counter_next_low[a];3===this.counter_mode[a]&&(this.counter_next_low[a]^=1);a=this.get_counter_value(a,I.microtick());return b?a&255:a>>8};kb.prototype.counter_write=function(a,b){this.counter_reload[a]=this.counter_next_low[a]?this.counter_reload[a]&-256|b:this.counter_reload[a]&255|b<<8;3===this.counter_read_mode[a]&&this.counter_next_low[a]||(this.counter_reload[a]||
|
|
142
|
+
(this.counter_reload[a]=65535),this.counter_start_value[a]=this.counter_reload[a],this.counter_enabled[a]=!0,this.counter_start_time[a]=I.microtick(),B("counter"+a+" reload="+n(this.counter_reload[a])+" tick="+(this.counter_reload[a]||65536)/1193.1816666+"ms",512));3===this.counter_read_mode[a]&&(this.counter_next_low[a]^=1)};kb.prototype.port43_write=function(a){var b=a>>1&7,c=a&1,d=a>>6&3;a=a>>4&3;1===d&&B("Unimplemented timer1",512);3===d?B("Unimplemented read back",512):0===a?(this.counter_latch[d]=
|
|
143
|
+
2,b=this.get_counter_value(d,I.microtick()),B("latch: "+b,512),this.counter_latch_value[d]=b?b-1:0):(6<=b&&(b&=-5),B("Control: mode="+b+" ctr="+d+" read_mode="+a+" bcd="+c,512),this.counter_next_low[d]=1===a?1:2===a?0:1,0===d&&this.cpu.device_lower_irq(0),0!==b&&3!==b&&2!==b&&B("Unimplemented counter mode: "+n(b),512),this.counter_mode[d]=b,this.counter_read_mode[d]=a,2===d&&this.bus.send("pcspeaker-update",[this.counter_mode[2],this.counter_reload[2]]))};kb.prototype.dump=function(){const a=this.counter_reload[0];
|
|
144
|
+
B("counter0 ticks every "+(a||65536)/1193.1816666+"ms (reload="+a+")")};function lb(a){if("undefined"!==typeof window)if(window.AudioContext||window.webkitAudioContext){var b=window.AudioWorklet?mb:nb;this.bus=a;this.audio_context=window.AudioContext?new AudioContext:new webkitAudioContext;this.mixer=new ob(a,this.audio_context);this.pcspeaker=new pb(a,this.audio_context,this.mixer);this.dac=new b(a,this.audio_context,this.mixer);this.pcspeaker.start();a.register("emulator-stopped",function(){this.audio_context.suspend()},
|
|
145
|
+
this);a.register("emulator-started",function(){this.audio_context.resume()},this);a.register("speaker-confirm-initialized",function(){a.send("speaker-has-initialized")},this);a.send("speaker-has-initialized")}else console.warn("Web browser doesn't support Web Audio API")}lb.prototype.destroy=function(){this.audio_context&&this.audio_context.close();this.audio_context=null;this.dac&&this.dac.node_processor&&this.dac.node_processor.port.close();this.dac=null};function ob(a,b){function c(d){return function(e){d.gain.setValueAtTime(e,
|
|
146
|
+
this.audio_context.currentTime)}}this.audio_context=b;this.sources=new Map;this.gain_right=this.gain_left=this.volume_right=this.volume_left=this.volume_both=1;this.node_treble_left=this.audio_context.createBiquadFilter();this.node_treble_right=this.audio_context.createBiquadFilter();this.node_treble_left.type="highshelf";this.node_treble_right.type="highshelf";this.node_treble_left.frequency.setValueAtTime(2E3,this.audio_context.currentTime);this.node_treble_right.frequency.setValueAtTime(2E3,this.audio_context.currentTime);
|
|
147
|
+
this.node_bass_left=this.audio_context.createBiquadFilter();this.node_bass_right=this.audio_context.createBiquadFilter();this.node_bass_left.type="lowshelf";this.node_bass_right.type="lowshelf";this.node_bass_left.frequency.setValueAtTime(200,this.audio_context.currentTime);this.node_bass_right.frequency.setValueAtTime(200,this.audio_context.currentTime);this.node_gain_left=this.audio_context.createGain();this.node_gain_right=this.audio_context.createGain();this.node_merger=this.audio_context.createChannelMerger(2);
|
|
148
|
+
this.input_left=this.node_treble_left;this.input_right=this.node_treble_right;this.node_treble_left.connect(this.node_bass_left);this.node_bass_left.connect(this.node_gain_left);this.node_gain_left.connect(this.node_merger,0,0);this.node_treble_right.connect(this.node_bass_right);this.node_bass_right.connect(this.node_gain_right);this.node_gain_right.connect(this.node_merger,0,1);this.node_merger.connect(this.audio_context.destination);a.register("mixer-connect",function(d){this.connect_source(d[0],
|
|
149
|
+
d[1])},this);a.register("mixer-disconnect",function(d){this.disconnect_source(d[0],d[1])},this);a.register("mixer-volume",function(d){var e=d[0],f=d[1];d=Math.pow(10,d[2]/20);var g=0===e?this:this.sources.get(e);void 0===g?l(!1,"Mixer set volume - cannot set volume for undefined source: "+e):g.set_volume(d,f)},this);a.register("mixer-gain-left",function(d){this.gain_left=Math.pow(10,d/20);this.update()},this);a.register("mixer-gain-right",function(d){this.gain_right=Math.pow(10,d/20);this.update()},
|
|
150
|
+
this);a.register("mixer-treble-left",c(this.node_treble_left),this);a.register("mixer-treble-right",c(this.node_treble_right),this);a.register("mixer-bass-left",c(this.node_bass_left),this);a.register("mixer-bass-right",c(this.node_bass_right),this)}ob.prototype.add_source=function(a,b){a=new qb(this.audio_context,a,this.input_left,this.input_right);l(!this.sources.has(b),"Mixer add source - overwritting source: "+b);this.sources.set(b,a);return a};ob.prototype.connect_source=function(a,b){var c=
|
|
151
|
+
this.sources.get(a);void 0===c?l(!1,"Mixer connect - cannot connect undefined source: "+a):c.connect(b)};ob.prototype.disconnect_source=function(a,b){var c=this.sources.get(a);void 0===c?l(!1,"Mixer disconnect - cannot disconnect undefined source: "+a):c.disconnect(b)};ob.prototype.set_volume=function(a,b){void 0===b&&(b=2);switch(b){case 0:this.volume_left=a;break;case 1:this.volume_right=a;break;case 2:this.volume_both=a;break;default:l(!1,"Mixer set master volume - unknown channel: "+b);return}this.update()};
|
|
152
|
+
ob.prototype.update=function(){var a=this.volume_both*this.volume_right*this.gain_right;this.node_gain_left.gain.setValueAtTime(this.volume_both*this.volume_left*this.gain_left,this.audio_context.currentTime);this.node_gain_right.gain.setValueAtTime(a,this.audio_context.currentTime)};function qb(a,b,c,d){this.audio_context=a;this.connected_right=this.connected_left=!0;this.volume_right=this.volume_left=this.volume_both=this.gain_hidden=1;this.node_splitter=a.createChannelSplitter(2);this.node_gain_left=
|
|
153
|
+
a.createGain();this.node_gain_right=a.createGain();b.connect(this.node_splitter);this.node_splitter.connect(this.node_gain_left,0);this.node_gain_left.connect(c);this.node_splitter.connect(this.node_gain_right,1);this.node_gain_right.connect(d)}qb.prototype.update=function(){var a=this.connected_right*this.gain_hidden*this.volume_both*this.volume_right;this.node_gain_left.gain.setValueAtTime(this.connected_left*this.gain_hidden*this.volume_both*this.volume_left,this.audio_context.currentTime);this.node_gain_right.gain.setValueAtTime(a,
|
|
154
|
+
this.audio_context.currentTime)};qb.prototype.connect=function(a){var b=!a||2===a;if(b||0===a)this.connected_left=!0;if(b||1===a)this.connected_right=!0;this.update()};qb.prototype.disconnect=function(a){var b=!a||2===a;if(b||0===a)this.connected_left=!1;if(b||1===a)this.connected_right=!1;this.update()};qb.prototype.set_volume=function(a,b){void 0===b&&(b=2);switch(b){case 0:this.volume_left=a;break;case 1:this.volume_right=a;break;case 2:this.volume_both=a;break;default:l(!1,"Mixer set volume - unknown channel: "+
|
|
155
|
+
b);return}this.update()};qb.prototype.set_gain_hidden=function(a){this.gain_hidden=a};function pb(a,b,c){this.node_oscillator=b.createOscillator();this.node_oscillator.type="square";this.node_oscillator.frequency.setValueAtTime(440,b.currentTime);this.mixer_connection=c.add_source(this.node_oscillator,1);this.mixer_connection.disconnect();a.register("pcspeaker-enable",function(){c.connect_source(1)},this);a.register("pcspeaker-disable",function(){c.disconnect_source(1)},this);a.register("pcspeaker-update",
|
|
156
|
+
function(d){var e=d[1],f=0;3===d[0]&&(f=Math.min(1193181.6665999999/e,this.node_oscillator.frequency.maxValue),f=Math.max(f,0));this.node_oscillator.frequency.setValueAtTime(f,b.currentTime)},this)}pb.prototype.start=function(){this.node_oscillator.start()};function mb(a,b,c){this.bus=a;this.audio_context=b;this.enabled=!1;this.sampling_rate=48E3;b=function(){function g(p){if(0===p)return 1;p*=Math.PI;return Math.sin(p)/p}function k(){var p=Reflect.construct(AudioWorkletProcessor,[],k);p.kernel_size=
|
|
157
|
+
3;p.queue_data=Array(1024);p.queue_start=0;p.queue_end=0;p.queue_length=0;p.queue_size=p.queue_data.length;p.queued_samples=0;p.source_buffer_previous=m;p.source_buffer_current=m;p.source_samples_per_destination=1;p.source_block_start=0;p.source_time=0;p.source_offset=0;p.port.onmessage=q=>{switch(q.data.type){case "queue":p.queue_push(q.data.value);break;case "sampling-rate":p.source_samples_per_destination=q.data.value/sampleRate}};return p}var m=[new Float32Array(256),new Float32Array(256)];Reflect.setPrototypeOf(k.prototype,
|
|
158
|
+
AudioWorkletProcessor.prototype);Reflect.setPrototypeOf(k,AudioWorkletProcessor);k.prototype.process=k.prototype.process=function(p,q){for(p=0;p<q[0][0].length;p++){for(var r=0,v=0,t=this.source_offset+this.kernel_size,z=this.source_offset-this.kernel_size+1;z<=t;z++){var A=this.source_block_start+z;r+=this.get_sample(A,0)*this.kernel(this.source_time-z);v+=this.get_sample(A,1)*this.kernel(this.source_time-z)}if(isNaN(r)||isNaN(v))r=v=0,this.dbg_log("ERROR: NaN values! Ignoring for now.");q[0][0][p]=
|
|
159
|
+
r;q[0][1][p]=v;this.source_time+=this.source_samples_per_destination;this.source_offset=Math.floor(this.source_time)}q=this.source_offset;q+=this.kernel_size+2;this.source_time-=this.source_offset;this.source_block_start+=this.source_offset;this.source_offset=0;this.ensure_enough_data(q);return!0};k.prototype.kernel=function(p){return g(p)*g(p/this.kernel_size)};k.prototype.get_sample=function(p,q){return 0>p?(p+=this.source_buffer_previous[0].length,this.source_buffer_previous[q][p]):this.source_buffer_current[q][p]};
|
|
160
|
+
k.prototype.ensure_enough_data=function(p){var q=this.source_buffer_current[0].length;q-this.source_block_start<p&&(this.prepare_next_buffer(),this.source_block_start-=q)};k.prototype.prepare_next_buffer=function(){256>this.queued_samples&&this.queue_length&&this.dbg_log("Not enough samples - should not happen during midway of playback");this.source_buffer_previous=this.source_buffer_current;this.source_buffer_current=this.queue_shift();var p=this.source_buffer_current[0].length;if(256>p){for(var q=
|
|
161
|
+
this.queue_start,r=0;256>p&&r<this.queue_length;)p+=this.queue_data[q][0].length,q=q+1&this.queue_size-1,r++;p=Math.max(p,256);p=[new Float32Array(p),new Float32Array(p)];p[0].set(this.source_buffer_current[0]);p[1].set(this.source_buffer_current[1]);q=this.source_buffer_current[0].length;for(var v=0;v<r;v++){var t=this.queue_shift();p[0].set(t[0],q);p[1].set(t[1],q);q+=t[0].length}this.source_buffer_current=p}this.pump()};k.prototype.pump=function(){1024>this.queued_samples/this.source_samples_per_destination&&
|
|
162
|
+
this.port.postMessage({type:"pump"})};k.prototype.queue_push=function(p){this.queue_length<this.queue_size&&(this.queue_data[this.queue_end]=p,this.queue_end=this.queue_end+1&this.queue_size-1,this.queue_length++,this.queued_samples+=p[0].length,this.pump())};k.prototype.queue_shift=function(){if(!this.queue_length)return m;var p=this.queue_data[this.queue_start];this.queue_data[this.queue_start]=null;this.queue_start=this.queue_start+1&this.queue_size-1;this.queue_length--;this.queued_samples-=p[0].length;
|
|
163
|
+
return p};k.prototype.dbg_log=function(p){this.port.postMessage({type:"debug-log",value:p})};registerProcessor("dac-processor",k)}.toString();var d=b.indexOf("{")+1,e=b.lastIndexOf("}");b=b.substring(d,e);b=new Blob(["var DEBUG = true;\n"+b],{type:"application/javascript"});var f=URL.createObjectURL(b);this.node_processor=null;this.node_output=this.audio_context.createGain();this.audio_context.audioWorklet.addModule(f).then(()=>{URL.revokeObjectURL(f);this.node_processor=new AudioWorkletNode(this.audio_context,
|
|
164
|
+
"dac-processor",{numberOfInputs:0,numberOfOutputs:1,outputChannelCount:[2],parameterData:{},processorOptions:{}});this.node_processor.port.postMessage({type:"sampling-rate",value:this.sampling_rate});this.node_processor.port.onmessage=g=>{switch(g.data.type){case "pump":this.pump();break;case "debug-log":B("SpeakerWorkletDAC - Worklet: "+g.data.value)}};this.node_processor.connect(this.node_output)});this.mixer_connection=c.add_source(this.node_output,2);this.mixer_connection.set_gain_hidden(3);a.register("dac-send-data",
|
|
165
|
+
function(g){this.queue(g)},this);a.register("dac-enable",function(){this.enabled=!0},this);a.register("dac-disable",function(){this.enabled=!1},this);a.register("dac-tell-sampling-rate",function(g){l(0<g,"Sampling rate should be nonzero");this.sampling_rate=g;this.node_processor&&this.node_processor.port.postMessage({type:"sampling-rate",value:g})},this);this.debugger=new rb(this.audio_context,this.node_output)}mb.prototype.queue=function(a){this.node_processor&&(this.debugger.push_queued_data(a),
|
|
166
|
+
this.node_processor.port.postMessage({type:"queue",value:a},[a[0].buffer,a[1].buffer]))};mb.prototype.pump=function(){this.enabled&&this.bus.send("dac-request-data")};function nb(a,b,c){this.bus=a;this.audio_context=b;this.enabled=!1;this.sampling_rate=22050;this.buffered_time=0;this.rate_ratio=1;this.node_lowpass=this.audio_context.createBiquadFilter();this.node_lowpass.type="lowpass";this.node_output=this.node_lowpass;this.mixer_connection=c.add_source(this.node_output,2);this.mixer_connection.set_gain_hidden(3);
|
|
167
|
+
a.register("dac-send-data",function(d){this.queue(d)},this);a.register("dac-enable",function(){this.enabled=!0;this.pump()},this);a.register("dac-disable",function(){this.enabled=!1},this);a.register("dac-tell-sampling-rate",function(d){l(0<d,"Sampling rate should be nonzero");this.sampling_rate=d;this.rate_ratio=Math.ceil(8E3/d);this.node_lowpass.frequency.setValueAtTime(d/2,this.audio_context.currentTime)},this);this.debugger=new rb(this.audio_context,this.node_output)}nb.prototype.queue=function(a){this.debugger.push_queued_data(a);
|
|
168
|
+
var b=a[0].length,c=b/this.sampling_rate;if(1<this.rate_ratio){var d=this.audio_context.createBuffer(2,b*this.rate_ratio,this.sampling_rate*this.rate_ratio);for(var e=d.getChannelData(0),f=d.getChannelData(1),g=0,k=0;k<b;k++)for(var m=0;m<this.rate_ratio;m++,g++)e[g]=a[0][k],f[g]=a[1][k]}else d=this.audio_context.createBuffer(2,b,this.sampling_rate),d.copyToChannel?(d.copyToChannel(a[0],0),d.copyToChannel(a[1],1)):(d.getChannelData(0).set(a[0]),d.getChannelData(1).set(a[1]));a=this.audio_context.createBufferSource();
|
|
169
|
+
a.buffer=d;a.connect(this.node_lowpass);a.addEventListener("ended",this.pump.bind(this));d=this.audio_context.currentTime;if(this.buffered_time<d)for(B("Speaker DAC - Creating/Recreating reserve - shouldn't occur frequently during playback"),this.buffered_time=d,d=.2-c,b=0;b<=d;)b+=c,this.buffered_time+=c,setTimeout(()=>this.pump(),1E3*b);a.start(this.buffered_time);this.buffered_time+=c;setTimeout(()=>this.pump(),0)};nb.prototype.pump=function(){this.enabled&&(.2<this.buffered_time-this.audio_context.currentTime||
|
|
170
|
+
this.bus.send("dac-request-data"))};function rb(a,b){this.audio_context=a;this.node_source=b;this.node_processor=null;this.node_gain=this.audio_context.createGain();this.node_gain.gain.setValueAtTime(0,this.audio_context.currentTime);this.node_gain.connect(this.audio_context.destination);this.is_active=!1;this.queued_history=[];this.output_history=[];this.queued=[[],[]];this.output=[[],[]]}rb.prototype.start=function(a){this.is_active=!0;this.queued=[[],[]];this.output=[[],[]];this.queued_history.push(this.queued);
|
|
171
|
+
this.output_history.push(this.output);this.node_processor=this.audio_context.createScriptProcessor(1024,2,2);this.node_processor.onaudioprocess=b=>{this.output[0].push(b.inputBuffer.getChannelData(0).slice());this.output[1].push(b.inputBuffer.getChannelData(1).slice())};this.node_source.connect(this.node_processor);this.node_processor.connect(this.node_gain);setTimeout(()=>{this.stop()},a)};rb.prototype.stop=function(){this.is_active=!1;this.node_source.disconnect(this.node_processor);this.node_processor.disconnect();
|
|
172
|
+
this.node_processor=null};rb.prototype.push_queued_data=function(a){this.is_active&&(this.queued[0].push(a[0].slice()),this.queued[1].push(a[1].slice()))};rb.prototype.download_txt=function(a,b){a=this.output_history[a][b].map(c=>c.join(" ")).join(" ");qa(a,"dacdata.txt")};rb.prototype.download_csv=function(a){a=this.output_history[a];for(var b=[],c=0;c<a[0].length;c++)for(var d=0;d<a[0][c].length;d++)b.push(`${a[0][c][d]},${a[1][c][d]}`);qa(b.join("\n"),"dacdata.csv")};function wb(a,b,c){this.bus=
|
|
173
|
+
b;this.socket=void 0;this.id=c||0;this.send_queue=[];this.url=a;this.reconnect_interval=1E4;this.last_connect_attempt=Date.now()-this.reconnect_interval;this.send_queue_limit=64;this.destroyed=!1;this.bus.register("net"+this.id+"-send",function(d){this.send(d)},this)}wb.prototype.handle_message=function(a){this.bus&&this.bus.send("net"+this.id+"-receive",new Uint8Array(a.data))};wb.prototype.handle_close=function(){this.destroyed||(this.connect(),setTimeout(this.connect.bind(this),this.reconnect_interval))};
|
|
174
|
+
wb.prototype.handle_open=function(){for(var a=0;a<this.send_queue.length;a++)this.send(this.send_queue[a]);this.send_queue=[]};wb.prototype.handle_error=function(){};wb.prototype.destroy=function(){this.destroyed=!0;this.socket&&this.socket.close()};wb.prototype.connect=function(){if("undefined"!==typeof WebSocket){if(this.socket){var a=this.socket.readyState;if(0===a||1===a)return}a=Date.now();if(!(this.last_connect_attempt+this.reconnect_interval>a)){this.last_connect_attempt=Date.now();try{this.socket=
|
|
175
|
+
new WebSocket(this.url)}catch(b){console.error(b);return}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)}}};wb.prototype.send=function(a){this.socket&&1===this.socket.readyState?this.socket.send(a):(this.send_queue.push(a),this.send_queue.length>2*this.send_queue_limit&&(this.send_queue=this.send_queue.slice(-this.send_queue_limit)),
|
|
176
|
+
this.connect())};wb.prototype.change_proxy=function(a){this.url=a;this.socket&&(this.socket.onclose=function(){},this.socket.onerror=function(){},this.socket.close(),this.socket=void 0)};const xb=(new Date("1970-01-01T00:00:00Z")).getTime(),yb=(new Date("1900-01-01T00:00:00Z")).getTime(),zb=xb-yb,Ab=Math.pow(2,32),Bb=[118,56,54];function Cb(a){return[0,1,2,3,4,5].map(b=>a[b].toString(16)).map(b=>1===b.length?"0"+b:b).join(":")}function Db(a){return a[0]<<24|a[1]<<16|a[2]<<8|a[3]}class Eb{constructor(a,
|
|
177
|
+
b){a=Math.min(a,16);this.maximum_capacity=b?Math.max(b,a):0;this.length=this.head=this.tail=0;this.buffer=new Uint8Array(a)}write(a){const b=a.length;var c=this.length+b;let d=this.buffer.length;if(d<c){for(l(0<d);d<c;)d*=2;if(this.maximum_capacity&&d>this.maximum_capacity)throw Error("stream capacity overflow in GrowableRingbuffer.write(), package dropped");c=new Uint8Array(d);this.peek(c);this.tail=0;this.head=this.length;this.buffer=c}c=this.buffer;const e=this.head+b;if(e>d){const f=d-this.head;
|
|
178
|
+
c.set(a.subarray(0,f),this.head);c.set(a.subarray(f))}else c.set(a,this.head);this.head=e%d;this.length+=b}peek(a){const b=Math.min(this.length,a.length);if(b){const e=this.buffer;var c=e.length,d=this.tail+b;d>c?(d%=c,c-=this.tail,a.set(e.subarray(this.tail)),a.set(e.subarray(0,d),c)):a.set(e.subarray(this.tail,d))}return b}remove(a){a>this.length&&(a=this.length);a&&(this.tail=(this.tail+a)%this.buffer.length,this.length-=a);return a}}function Fb(){const a=new Uint8Array(1518),b=a.buffer,c=a.byteOffset;
|
|
179
|
+
return{eth_frame:a,eth_frame_view:new DataView(b),eth_payload_view:new DataView(b,c+14,1500),ipv4_payload_view:new DataView(b,c+34,1480),udp_payload_view:new DataView(b,c+42,1472),text_encoder:new TextEncoder}}function Gb(a,b,c,d){d.eth_frame.set(b,c.byteOffset+a);return b.length}function Hb(a,b,c,d){const e=c.byteOffset+(a&-2);d=d.eth_frame;for(c=c.byteOffset;c<e;c+=2)b+=d[c]<<8|d[c+1];for(a&1&&(b+=d[e]<<8);b>>>16;)b=(b&65535)+(b>>>16);return~b&65535}function Ib(a,b){l(b.eth);a.eth_frame.fill(0);
|
|
180
|
+
var c=a.eth_frame,d=c.subarray,e=a.eth_frame_view;Gb(0,b.eth.dest,e,a);Gb(6,b.eth.src,e,a);e.setUint16(12,b.eth.ethertype);e=14;if(b.arp){var f=a.eth_payload_view;f.setUint16(0,b.arp.htype);f.setUint16(2,b.arp.ptype);f.setUint8(4,b.arp.sha.length);f.setUint8(5,b.arp.spa.length);f.setUint16(6,b.arp.oper);Gb(8,b.arp.sha,f,a);Gb(14,b.arp.spa,f,a);Gb(18,b.arp.tha,f,a);Gb(24,b.arp.tpa,f,a);e+=28}else if(b.ipv4){f=a.eth_payload_view;var g=20;if(b.icmp){var k=a.ipv4_payload_view;k.setUint8(0,b.icmp.type);
|
|
181
|
+
k.setUint8(1,b.icmp.code);k.setUint16(2,0);var m=4+Gb(4,b.icmp.data,k,a);k.setUint16(2,Hb(m,0,k,a));g+=m}else if(b.udp){k=a.ipv4_payload_view;var p=8;if(b.dhcp){m=p;var q=a.udp_payload_view;q.setUint8(0,b.dhcp.op);q.setUint8(1,b.dhcp.htype);q.setUint8(2,b.dhcp.hlen);q.setUint8(3,b.dhcp.hops);q.setUint32(4,b.dhcp.xid);q.setUint16(8,b.dhcp.secs);q.setUint16(10,b.dhcp.flags);q.setUint32(12,b.dhcp.ciaddr);q.setUint32(16,b.dhcp.yiaddr);q.setUint32(20,b.dhcp.siaddr);q.setUint32(24,b.dhcp.giaddr);Gb(28,
|
|
182
|
+
b.dhcp.chaddr,q,a);q.setUint32(236,1669485411);p=240;for(var r of b.dhcp.options)p+=Gb(p,r,q,a);m+=p}else if(b.dns){r=p;p=a.udp_payload_view;p.setUint16(0,b.dns.id);p.setUint16(2,b.dns.flags);p.setUint16(4,b.dns.questions.length);p.setUint16(6,b.dns.answers.length);let z=12;for(var v=0;v<b.dns.questions.length;++v){var t=b.dns.questions[v];for(q of t.name){const A=a.text_encoder.encodeInto(q,a.eth_frame.subarray(p.byteOffset+(z+1))).written;p.setUint8(z,A);z+=1+A}p.setUint16(z,t.type);z+=2;p.setUint16(z,
|
|
183
|
+
t.class);z+=2}for(v=0;v<b.dns.answers.length;++v){q=b.dns.answers[v];for(m of q.name)t=a.text_encoder.encodeInto(m,a.eth_frame.subarray(p.byteOffset+(z+1))).written,p.setUint8(z,t),z+=1+t;p.setUint16(z,q.type);z+=2;p.setUint16(z,q.class);z+=2;p.setUint32(z,q.ttl);z+=4;p.setUint16(z,q.data.length);z+=2;z+=Gb(z,q.data,p,a)}m=r+z}else b.ntp?(m=p,q=a.udp_payload_view,q.setUint8(0,b.ntp.flags),q.setUint8(1,b.ntp.stratum),q.setUint8(2,b.ntp.poll),q.setUint8(3,b.ntp.precision),q.setUint32(4,b.ntp.root_delay),
|
|
184
|
+
q.setUint32(8,b.ntp.root_disp),q.setUint32(12,b.ntp.ref_id),q.setUint32(16,b.ntp.ref_ts_i),q.setUint32(20,b.ntp.ref_ts_f),q.setUint32(24,b.ntp.ori_ts_i),q.setUint32(28,b.ntp.ori_ts_f),q.setUint32(32,b.ntp.rec_ts_i),q.setUint32(36,b.ntp.rec_ts_f),q.setUint32(40,b.ntp.trans_ts_i),q.setUint32(44,b.ntp.trans_ts_f),m+=48):m=p+Gb(0,b.udp.data,a.udp_payload_view,a);p=m;k.setUint16(0,b.udp.sport);k.setUint16(2,b.udp.dport);k.setUint16(4,p);k.setUint16(6,0);k.setUint16(6,Hb(p,(b.ipv4.src[0]<<8|b.ipv4.src[1])+
|
|
185
|
+
(b.ipv4.src[2]<<8|b.ipv4.src[3])+(b.ipv4.dest[0]<<8|b.ipv4.dest[1])+(b.ipv4.dest[2]<<8|b.ipv4.dest[3])+17+p,k,a));g+=p}else b.tcp&&(k=a.ipv4_payload_view,m=0,q=b.tcp,q.fin&&(m|=1),q.syn&&(m|=2),q.rst&&(m|=4),q.psh&&(m|=8),q.ack&&(m|=16),q.urg&&(m|=32),q.ece&&(m|=64),q.cwr&&(m|=128),k.setUint16(0,q.sport),k.setUint16(2,q.dport),k.setUint32(4,q.seq),k.setUint32(8,q.ackn),k.setUint8(12,80),k.setUint8(13,m),k.setUint16(14,q.winsize),k.setUint16(16,0),k.setUint16(18,q.urgent||0),m=20,b.tcp_data&&(m+=Gb(20,
|
|
186
|
+
b.tcp_data,k,a)),k.setUint16(16,Hb(m,(b.ipv4.src[0]<<8|b.ipv4.src[1])+(b.ipv4.src[2]<<8|b.ipv4.src[3])+(b.ipv4.dest[0]<<8|b.ipv4.dest[1])+(b.ipv4.dest[2]<<8|b.ipv4.dest[3])+6+m,k,a)),g+=m);f.setUint8(0,69);f.setUint8(1,b.ipv4.tos||0);f.setUint16(2,g);f.setUint16(4,b.ipv4.id||0);f.setUint8(6,64);f.setUint8(8,b.ipv4.ttl||32);f.setUint8(9,b.ipv4.proto);f.setUint16(10,0);Gb(12,b.ipv4.src,f,a);Gb(16,b.ipv4.dest,f,a);f.setUint16(10,Hb(20,0,f,a));e+=g}return d.call(c,0,e)}function Jb(a,b){fetch(`https://${b.doh_server||
|
|
187
|
+
"cloudflare-dns.com"}/dns-query`,{method:"POST",headers:[["content-type","application/dns-message"]],body:a.udp.data}).then(async c=>{c={eth:{ethertype:2048,src:b.router_mac,dest:a.eth.src},ipv4:{proto:17,src:b.router_ip,dest:a.ipv4.src},udp:{sport:53,dport:a.udp.sport,data:new Uint8Array(await c.arrayBuffer())}};b.receive(Ib(b.eth_encoder_buf,c))});return!0}function Tb(a,b){let c={};c.eth={ethertype:2048,src:b.router_mac,dest:a.eth.src};c.ipv4={proto:17,src:b.router_ip,dest:b.vm_ip};c.udp={sport:67,
|
|
188
|
+
dport:68};c.dhcp={htype:1,hlen:6,hops:0,xid:a.dhcp.xid,secs:0,flags:0,ciaddr:0,yiaddr:Db(b.vm_ip),siaddr:Db(b.router_ip),giaddr:Db(b.router_ip),chaddr:a.dhcp.chaddr};let d=[],e=a.dhcp.options.find(function(f){return 53===f[0]});e&&3===e[2]&&(a.dhcp.op=3);1===a.dhcp.op&&(c.dhcp.op=2,d.push(new Uint8Array([53,1,2])));3===a.dhcp.op&&(c.dhcp.op=2,d.push(new Uint8Array([53,1,5])),d.push(new Uint8Array([51,4,8,0,0,0])));a=[b.router_ip[0],b.router_ip[1],b.router_ip[2],b.router_ip[3]];d.push(new Uint8Array([1,
|
|
189
|
+
4,255,255,255,0]));b.masquerade&&(d.push(new Uint8Array([3,4].concat(a))),d.push(new Uint8Array([6,4].concat(a))));d.push(new Uint8Array([54,4].concat(a)));d.push(new Uint8Array([60,3].concat(Bb)));d.push(new Uint8Array([255,0]));c.dhcp.options=d;b.receive(Ib(b.eth_encoder_buf,c))}function Ub(a,b){let c={};var d=(new DataView(a.buffer,a.byteOffset,a.byteLength)).getUint16(12),e={ethertype:d,dest:a.subarray(0,6),dest_s:Cb(a.subarray(0,6)),src:a.subarray(6,12),src_s:Cb(a.subarray(6,12))};c.eth=e;a=
|
|
190
|
+
a.subarray(14,a.length);if(2048===d){var f=new DataView(a.buffer,a.byteOffset,a.byteLength),g=a[0]>>4&15;e=a[0]&15;var k=f.getUint8(1),m=f.getUint16(2);let p=f.getUint8(8);d=f.getUint8(9);f=f.getUint16(10);g={version:g,ihl:e,tos:k,len:m,ttl:p,proto:d,ip_checksum:f,src:a.subarray(12,16),dest:a.subarray(16,20)};Math.max(m,46)!==a.length&&B(`ipv4 Length mismatch: ${m} != ${a.length}`,16777216);c.ipv4=g;e=a.subarray(4*e,m);if(1===d)a=new DataView(e.buffer,e.byteOffset,e.byteLength),a={type:a.getUint8(0),
|
|
191
|
+
code:a.getUint8(1),checksum:a.getUint16(2),data:e.subarray(4)},c.icmp=a;else if(6===d)d=new DataView(e.buffer,e.byteOffset,e.byteLength),a={sport:d.getUint16(0),dport:d.getUint16(2),seq:d.getUint32(4),ackn:d.getUint32(8),doff:d.getUint8(12)>>4,winsize:d.getUint16(14),checksum:d.getUint16(16),urgent:d.getUint16(18)},d=d.getUint8(13),a.fin=!!(d&1),a.syn=!!(d&2),a.rst=!!(d&4),a.psh=!!(d&8),a.ack=!!(d&16),a.urg=!!(d&32),a.ece=!!(d&64),a.cwr=!!(d&128),c.tcp=a,c.tcp_data=e.subarray(4*a.doff);else if(17===
|
|
192
|
+
d){a=new DataView(e.buffer,e.byteOffset,e.byteLength);a={sport:a.getUint16(0),dport:a.getUint16(2),len:a.getUint16(4),checksum:a.getUint16(6),data:e.subarray(8),data_s:(new TextDecoder).decode(e.subarray(8))};if(67===a.dport||67===a.sport){e=e.subarray(8);d=new DataView(e.buffer,e.byteOffset,e.byteLength);e.subarray(44,236);d={op:d.getUint8(0),htype:d.getUint8(1),hlen:d.getUint8(2),hops:d.getUint8(3),xid:d.getUint32(4),secs:d.getUint16(8),flags:d.getUint16(10),ciaddr:d.getUint32(12),yiaddr:d.getUint32(16),
|
|
193
|
+
siaddr:d.getUint32(20),giaddr:d.getUint32(24),chaddr:e.subarray(28,44),magic:d.getUint32(236),options:[]};e=e.subarray(240);for(m=0;m<e.length;++m)g=m,0!==e[m]&&(++m,k=e[m],m+=k,d.options.push(e.subarray(g,g+k+2)));c.dhcp=d;c.dhcp_options=d.options}else 53===a.dport||53===a.sport?Vb(e.subarray(8),c):123===a.dport&&(d=e.subarray(8),d=new DataView(d.buffer,d.byteOffset,d.byteLength),c.ntp={flags:d.getUint8(0),stratum:d.getUint8(1),poll:d.getUint8(2),precision:d.getUint8(3),root_delay:d.getUint32(4),
|
|
194
|
+
root_disp:d.getUint32(8),ref_id:d.getUint32(12),ref_ts_i:d.getUint32(16),ref_ts_f:d.getUint32(20),ori_ts_i:d.getUint32(24),ori_ts_f:d.getUint32(28),rec_ts_i:d.getUint32(32),rec_ts_f:d.getUint32(36),trans_ts_i:d.getUint32(40),trans_ts_f:d.getUint32(44)});c.udp=a}}else 2054===d?(d=new DataView(a.buffer,a.byteOffset,a.byteLength),a={htype:d.getUint16(0),ptype:d.getUint16(2),oper:d.getUint16(6),sha:a.subarray(8,14),spa:a.subarray(14,18),tha:a.subarray(18,24),tpa:a.subarray(24,28)},c.arp=a):34525===d?
|
|
195
|
+
B("Unimplemented: ipv6"):B("Unknown ethertype: "+n(d),16777216);if(c.ipv4)if(c.tcp)a:{a=`${c.ipv4.src.join(".")}:${c.tcp.sport}:${c.ipv4.dest.join(".")}:${c.tcp.dport}`;if(c.tcp.syn&&(b.tcp_conn[a]&&B("SYN to already opened port",16777216),b.on_tcp_connection(c,a)))break a;if(b.tcp_conn[a])b.tcp_conn[a].process(c);else{B(`I dont know about ${a}, so resetting`,16777216);a=c.tcp.ackn;if(c.tcp.fin||c.tcp.syn)a+=1;d={};d.eth={ethertype:2048,src:b.router_mac,dest:c.eth.src};d.ipv4={proto:6,src:c.ipv4.dest,
|
|
196
|
+
dest:c.ipv4.src};d.tcp={sport:c.tcp.dport,dport:c.tcp.sport,seq:a,ackn:c.tcp.seq+(c.tcp.syn?1:0),winsize:c.tcp.winsize,rst:!0,ack:c.tcp.syn};b.receive(Ib(b.eth_encoder_buf,d))}}else if(c.udp)if(c.dns)if("static"===b.dns_method){a={};a.eth={ethertype:2048,src:b.router_mac,dest:c.eth.src};a.ipv4={proto:17,src:b.router_ip,dest:c.ipv4.src};a.udp={sport:53,dport:c.udp.sport};d=[];for(e=0;e<c.dns.questions.length;++e)switch(m=c.dns.questions[e],m.type){case 1:d.push({name:m.name,type:m.type,class:m.class,
|
|
197
|
+
ttl:600,data:[192,168,87,1]})}a.dns={id:c.dns.id,flags:33152,questions:c.dns.questions,answers:d};b.receive(Ib(b.eth_encoder_buf,a))}else Jb(c,b);else c.dhcp?Tb(c,b):c.ntp?(a=Date.now()+zb,d=a%1E3/1E3*Ab,e={},e.eth={ethertype:2048,src:b.router_mac,dest:c.eth.src},e.ipv4={proto:17,src:c.ipv4.dest,dest:c.ipv4.src},e.udp={sport:123,dport:c.udp.sport},e.ntp=Object.assign({},c.ntp),e.ntp.flags=36,e.ntp.poll=10,e.ntp.ori_ts_i=c.ntp.trans_ts_i,e.ntp.ori_ts_f=c.ntp.trans_ts_f,e.ntp.rec_ts_i=a/1E3,e.ntp.rec_ts_f=
|
|
198
|
+
d,e.ntp.trans_ts_i=a/1E3,e.ntp.trans_ts_f=d,e.ntp.stratum=2,b.receive(Ib(b.eth_encoder_buf,e))):8===c.udp.dport&&(a={},a.eth={ethertype:2048,src:b.router_mac,dest:c.eth.src},a.ipv4={proto:17,src:c.ipv4.dest,dest:c.ipv4.src},a.udp={sport:c.udp.dport,dport:c.udp.sport,data:(new TextEncoder).encode(c.udp.data_s)},b.receive(Ib(b.eth_encoder_buf,a)));else c.icmp&&8===c.icmp.type&&(a={},a.eth={ethertype:2048,src:b.router_mac,dest:c.eth.src},a.ipv4={proto:1,src:c.ipv4.dest,dest:c.ipv4.src},a.icmp={type:0,
|
|
199
|
+
code:c.icmp.code,data:c.icmp.data},b.receive(Ib(b.eth_encoder_buf,a)));else c.arp&&1===c.arp.oper&&2048===c.arp.ptype&&(a=Db(c.arp.tpa)&4294967040,d=Db(b.router_ip)&4294967040,!b.masquerade&&a!==d||a===d&&99<c.arp.tpa[3]||(a={},a.eth={ethertype:2054,src:b.router_mac,dest:c.eth.src},a.arp={htype:1,ptype:2048,oper:2,sha:b.router_mac,spa:c.arp.tpa,tha:c.eth.src,tpa:c.arp.spa},b.receive(Ib(b.eth_encoder_buf,a))))}function Vb(a,b){function c(){let p=[],q;do q=d.getUint8(k),p.push((new TextDecoder).decode(a.subarray(k+
|
|
200
|
+
1,k+1+q))),k+=q+1;while(0<q);return p}let d=new DataView(a.buffer,a.byteOffset,a.byteLength),e={id:d.getUint16(0),flags:d.getUint16(2),questions:[],answers:[]};var f=d.getUint16(4);let g=d.getUint16(6);d.getUint16(8);d.getUint16(10);let k=12;for(var m=0;m<f;m++)e.questions.push({name:c(),type:d.getInt16(k),class:d.getInt16(k+2)}),k+=4;for(f=0;f<g;f++){m={name:c(),type:d.getInt16(k),class:d.getUint16(k+2),ttl:d.getUint32(k+4)};k+=8;let p=d.getUint16(k);k+=2;m.data=a.subarray(k,k+p);k+=p;e.answers.push(m)}b.dns=
|
|
201
|
+
e}function Wb(a,b){var c=b.vm_ip.join(".");const d=b.router_ip.join("."),e=16383*Math.random()|0;let f,g,k=0;do f=49152+(e+k)%16383,g=`${c}:${a}:${d}:${f}`;while(16383>++k&&b.tcp_conn[g]);if(b.tcp_conn[g])throw Error("pool of dynamic TCP port numbers exhausted, connection aborted");c=new Xb;c.tuple=g;c.hsrc=b.router_mac;c.psrc=b.router_ip;c.sport=f;c.hdest=b.vm_mac;c.dport=a;c.pdest=b.vm_ip;c.net=b;b.tcp_conn[g]=c;c.connect();return c}function Yb(a,b){return new Promise(c=>{let d=Wb(a,b);d.state=
|
|
202
|
+
"syn-probe";d.on("probe",c)})}function Xb(){this.state="closed";this.net=null;this.send_buffer=new Eb(2048,0);this.send_chunk_buf=new Uint8Array(1460);this.delayed_send_fin=this.in_active_close=!1;this.delayed_state=void 0;this.events_handlers={}}Xb.prototype.on=function(a,b){this.events_handlers[a]=b};Xb.prototype.emit=function(a,...b){this.events_handlers[a]&&this.events_handlers[a].apply(this,b)};Xb.prototype.ipv4_reply=function(){let a={};a.eth={ethertype:2048,src:this.hsrc,dest:this.hdest};a.ipv4=
|
|
203
|
+
{proto:6,src:this.psrc,dest:this.pdest};a.tcp={sport:this.sport,dport:this.dport,winsize:this.winsize,ackn:this.ack,seq:this.seq,ack:!0};return a};Xb.prototype.packet_reply=function(a,b){a={sport:a.tcp.dport,dport:a.tcp.sport,winsize:a.tcp.winsize,ackn:this.ack,seq:this.seq};if(b)for(const c in b)a[c]=b[c];b=this.ipv4_reply();b.tcp=a;return b};Xb.prototype.connect=function(){this.seq=1338;this.ack=1;this.start_seq=0;this.winsize=64240;this.state="syn-sent";let a=this.ipv4_reply();a.ipv4.id=2345;a.tcp=
|
|
204
|
+
{sport:this.sport,dport:this.dport,seq:1337,ackn:0,winsize:0,syn:!0};this.net.receive(Ib(this.net.eth_encoder_buf,a))};Xb.prototype.accept=function(a){this.seq=1338;this.ack=a.tcp.seq+1;this.start_seq=a.tcp.seq;this.hsrc=this.net.router_mac;this.psrc=a.ipv4.dest;this.sport=a.tcp.dport;this.hdest=a.eth.src;this.dport=a.tcp.sport;this.pdest=a.ipv4.src;this.winsize=a.tcp.winsize;let b=this.ipv4_reply();b.tcp={sport:this.sport,dport:this.dport,seq:1337,ackn:this.ack,winsize:a.tcp.winsize,syn:!0,ack:!0};
|
|
205
|
+
this.state="established";this.net.receive(Ib(this.net.eth_encoder_buf,b))};Xb.prototype.process=function(a){if("closed"===this.state)a=this.packet_reply(a,{rst:!0}),this.net.receive(Ib(this.net.eth_encoder_buf,a));else if(a.tcp.rst){if("syn-probe"===this.state)this.emit("probe",!1);else this.on_close();this.release()}else if(a.tcp.syn){if("syn-sent"===this.state&&a.tcp.ack){this.ack=a.tcp.seq+1;this.start_seq=a.tcp.seq;this.last_received_ackn=a.tcp.ackn;var b=this.ipv4_reply();this.net.receive(Ib(this.net.eth_encoder_buf,
|
|
206
|
+
b));this.state="established";this.emit("connect")}else"syn-probe"===this.state&&a.tcp.ack?(this.emit("probe",!0),b=this.packet_reply(a,{rst:!0}),this.net.receive(Ib(this.net.eth_encoder_buf,b)),this.release()):B(`TCP[${this.tuple}]: WARNING: unexpected SYN packet dropped`,16777216);a.tcp_data.length&&B(`TCP[${this.tuple}]: WARNING: ${a.tcp_data.length} bytes of unexpected SYN packet payload dropped`,16777216)}else{if(a.tcp.ack)if("syn-received"===this.state)this.state="established";else if("fin-wait-1"===
|
|
207
|
+
this.state)a.tcp.fin||(this.state="fin-wait-2");else if("closing"===this.state||"last-ack"===this.state){this.release();return}if(void 0===this.last_received_ackn)this.last_received_ackn=a.tcp.ackn;else if(b=a.tcp.ackn-this.last_received_ackn,0<b){if(this.last_received_ackn=a.tcp.ackn,this.send_buffer.remove(b),this.seq+=b,this.pending=!1,this.delayed_send_fin&&!this.send_buffer.length){this.delayed_send_fin=!1;this.state=this.delayed_state;a=this.ipv4_reply();a.tcp.fin=!0;this.net.receive(Ib(this.net.eth_encoder_buf,
|
|
208
|
+
a));return}}else if(0>b){B(`TCP[${this.tuple}]: ERROR: ack underflow (pkt=${a.tcp.ackn} last=${this.last_received_ackn}), resetting`,16777216);a=this.packet_reply(a,{rst:!0});this.net.receive(Ib(this.net.eth_encoder_buf,a));this.on_close();this.release();return}a.tcp.fin?(this.ack!==a.tcp.seq&&B(`TCP[${this.tuple}]: WARNING: closing connection in state "${this.state}" with invalid seq (${this.ack} != ${a.tcp.seq})`,16777216),++this.ack,b=this.packet_reply(a,{}),"established"===this.state?(b.tcp.ack=
|
|
209
|
+
!0,this.state="close-wait",this.on_shutdown()):"fin-wait-1"===this.state?(a.tcp.ack?this.release():this.state="closing",b.tcp.ack=!0):"fin-wait-2"===this.state?(this.release(),b.tcp.ack=!0):(this.release(),this.on_close(),b.tcp.rst=!0),this.net.receive(Ib(this.net.eth_encoder_buf,b))):this.ack!==a.tcp.seq?(this.ack!==a.tcp.seq+1&&B(`Packet seq was wrong ex: ${this.ack} ~${this.ack-this.start_seq} `+`pk: ${a.tcp.seq} ~${this.start_seq-a.tcp.seq} `+`(${this.ack-a.tcp.seq}) = ${this.name}`,16777216),
|
|
210
|
+
a=this.packet_reply(a,{ack:!0}),this.net.receive(Ib(this.net.eth_encoder_buf,a))):a.tcp.ack&&0<a.tcp_data.length&&(this.ack+=a.tcp_data.length,b=this.ipv4_reply(),this.net.receive(Ib(this.net.eth_encoder_buf,b)),this.emit("data",a.tcp_data));this.pump()}};Xb.prototype.write=function(a){this.in_active_close||this.send_buffer.write(a);this.pump()};Xb.prototype.writev=function(a){if(!this.in_active_close)for(const b of a)this.send_buffer.write(b);this.pump()};Xb.prototype.close=function(){if(!this.in_active_close){this.in_active_close=
|
|
211
|
+
!0;if("established"===this.state||"syn-received"===this.state)var a="fin-wait-1";else if("close-wait"===this.state)a="last-ack";else{"syn-sent"!==this.state&&B(`TCP[${this.tuple}]: active close in unexpected state "${this.state}"`,16777216);this.release();return}this.send_buffer.length||this.pending?(this.delayed_send_fin=!0,this.delayed_state=a):(this.state=a,a=this.ipv4_reply(),a.tcp.fin=!0,this.net.receive(Ib(this.net.eth_encoder_buf,a)))}this.pump()};Xb.prototype.on_shutdown=function(){this.emit("shutdown")};
|
|
212
|
+
Xb.prototype.on_close=function(){this.emit("close")};Xb.prototype.release=function(){this.net.tcp_conn[this.tuple]&&(this.state="closed",delete this.net.tcp_conn[this.tuple])};Xb.prototype.pump=function(){if(this.send_buffer.length&&!this.pending){const a=this.send_chunk_buf,b=this.send_buffer.peek(a),c=this.ipv4_reply();c.tcp.psh=!0;c.tcp_data=a.subarray(0,b);this.net.receive(Ib(this.net.eth_encoder_buf,c));this.pending=!0}};function Zb(a,b){b=b||{};this.bus=a;this.id=b.id||0;this.router_mac=new Uint8Array((b.router_mac||
|
|
213
|
+
"52:54:0:1:2:3").split(":").map(function(c){return parseInt(c,16)}));this.router_ip=new Uint8Array((b.router_ip||"192.168.86.1").split(".").map(function(c){return parseInt(c,10)}));this.vm_ip=new Uint8Array((b.vm_ip||"192.168.86.100").split(".").map(function(c){return parseInt(c,10)}));this.masquerade=void 0===b.masquerade||!!b.masquerade;this.vm_mac=new Uint8Array(6);this.dns_method=b.dns_method||"static";this.doh_server=b.doh_server;this.tcp_conn={};this.eth_encoder_buf=Fb();this.fetch=(...c)=>
|
|
214
|
+
fetch(...c);this.cors_proxy=b.cors_proxy;this.bus.register("net"+this.id+"-mac",function(c){this.vm_mac=new Uint8Array(c.split(":").map(function(d){return parseInt(d,16)}))},this);this.bus.register("net"+this.id+"-send",function(c){this.send(c)},this)}Zb.prototype.destroy=function(){};Zb.prototype.on_tcp_connection=function(a,b){if(80===a.tcp.dport){let c=new Xb;c.state="syn-received";c.net=this;c.on("data",$b);c.tuple=b;c.accept(a);this.tcp_conn[b]=c;return!0}return!1};Zb.prototype.connect=function(a){return Wb(a,
|
|
215
|
+
this)};Zb.prototype.tcp_probe=function(a){return Yb(a,this)};async function $b(a){this.read=this.read||"";if((this.read+=(new TextDecoder).decode(a))&&-1!==this.read.indexOf("\r\n\r\n")){a=this.read.indexOf("\r\n\r\n");var b=this.read.substring(0,a).split(/\r\n/);a=this.read.substring(a+4);this.read="";let c=b[0].split(" "),d;d=/^https?:/.test(c[1])?new URL(c[1]):new URL("http://host"+c[1]);"undefined"!==typeof window&&"http:"===d.protocol&&"https:"===window.location.protocol&&(d.protocol="https:");
|
|
216
|
+
let e=new Headers;for(let k=1;k<b.length;++k){const m=this.net.parse_http_header(b[k]);if(!m){console.warn('The request contains an invalid header: "%s"',b[k]);this.net.respond_text_and_close(this,400,"Bad Request",`Invalid header in request: ${b[k]}`);return}"host"===m.key.toLowerCase()?d.host=m.value:e.append(m.key,m.value)}if(!this.net.cors_proxy&&/^\d+\.external$/.test(d.hostname))if(B("Request to localhost: "+d.href,16777216),b=parseInt(d.hostname.split(".")[0],10),!isNaN(b)&&0<b&&65536>b)d.protocol=
|
|
217
|
+
"http:",d.hostname="localhost",d.port=b.toString(10);else{console.warn('Unknown port for localhost: "%s"',d.href);this.net.respond_text_and_close(this,400,"Bad Request",`Unknown port for localhost: ${d.href}`);return}B("HTTP Dispatch: "+d.href,16777216);this.name=d.href;b={method:c[0],headers:e};-1!==["put","post"].indexOf(b.method.toLowerCase())&&(b.body=a);const f=this.net.cors_proxy?this.net.cors_proxy+encodeURIComponent(d.href):d.href;new TextEncoder;let g=!1;this.net.fetch(f,b).then(k=>{let m=
|
|
218
|
+
new Headers(k.headers);m.delete("content-encoding");m.delete("keep-alive");m.delete("content-length");m.delete("transfer-encoding");m.set("x-was-fetch-redirected",`${!!k.redirected}`);m.set("x-fetch-resp-url",k.url);m.set("connection","close");this.write(this.net.form_response_head(k.status,k.statusText,m));g=!0;if(k.body&&k.body.getReader){const p=k.body.getReader(),q=({value:r,done:v})=>{r&&this.write(r);if(v)this.close();else return p.read().then(q)};p.read().then(q)}else k.arrayBuffer().then(p=>
|
|
219
|
+
{this.write(new Uint8Array(p));this.close()})}).catch(k=>{console.warn("Fetch Failed: "+f+"\n"+k);g||this.net.respond_text_and_close(this,502,"Fetch Error",`Fetch ${f} failed:\n\n${k.stack||k.message}`);this.close()})}}Zb.prototype.fetch=async function(a,b){this.cors_proxy&&(a=this.cors_proxy+encodeURIComponent(a));try{const c=await fetch(a,b),d=await c.arrayBuffer();return[c,d]}catch(c){return console.warn("Fetch Failed: "+a+"\n"+c),[{status:502,statusText:"Fetch Error",headers:new Headers({"Content-Type":"text/plain"})},
|
|
220
|
+
(new TextEncoder).encode(`Fetch ${a} failed:\n\n${c.stack}`).buffer]}};Zb.prototype.form_response_head=function(a,b,c){a=[`HTTP/1.1 ${a} ${b}`];for(const [d,e]of c.entries())a.push(`${d}: ${e}`);return(new TextEncoder).encode(a.join("\r\n")+"\r\n\r\n")};Zb.prototype.respond_text_and_close=function(a,b,c,d){const e=new Headers({"content-type":"text/plain","content-length":d.length.toString(10),connection:"close"});a.writev([this.form_response_head(b,c,e),(new TextEncoder).encode(d)]);a.close()};Zb.prototype.parse_http_header=
|
|
221
|
+
function(a){var b=a.match(/^([^:]*):(.*)$/);if(b)if(a=b[1],b=b[2].trim(),0===a.length)B("Header key is empty, raw header",16777216);else if(0===b.length)B("Header value is empty",16777216);else if(/^[\w-]+$/.test(a)){if(/^[\x20-\x7E]+$/.test(b))return{key:a,value:b};B("Header value contains forbidden characters",16777216)}else B("Header key contains forbidden characters",16777216);else B("Unable to parse HTTP header",16777216)};Zb.prototype.send=function(a){Ub(a,this)};Zb.prototype.receive=function(a){this.bus.send("net"+
|
|
222
|
+
this.id+"-receive",new Uint8Array(a))};function ac(a,b,c){this.register_ws(a);this.last_stream=1;this.connections={0:{congestion:0}};this.congested_buffer=[];c=c||{};this.bus=b;this.id=c.id||0;this.router_mac=new Uint8Array((c.router_mac||"52:54:0:1:2:3").split(":").map(function(d){return parseInt(d,16)}));this.router_ip=new Uint8Array((c.router_ip||"192.168.86.1").split(".").map(function(d){return parseInt(d,10)}));this.vm_ip=new Uint8Array((c.vm_ip||"192.168.86.100").split(".").map(function(d){return parseInt(d,
|
|
223
|
+
10)}));this.masquerade=void 0===c.masquerade||!!c.masquerade;this.vm_mac=new Uint8Array(6);this.dns_method=c.dns_method||"doh";this.doh_server=c.doh_server;this.tcp_conn={};this.eth_encoder_buf=Fb();this.bus.register("net"+this.id+"-mac",function(d){this.vm_mac=new Uint8Array(d.split(":").map(function(e){return parseInt(e,16)}))},this);this.bus.register("net"+this.id+"-send",function(d){this.send(d)},this)}ac.prototype.register_ws=function(a){this.wispws=new WebSocket(a.replace("wisp://","ws://").replace("wisps://",
|
|
224
|
+
"wss://"));this.wispws.binaryType="arraybuffer";this.wispws.onmessage=b=>{this.process_incoming_wisp_frame(new Uint8Array(b.data))};this.wispws.onclose=()=>{setTimeout(()=>{this.register_ws(a)},1E4)}};ac.prototype.send_packet=function(a,b,c){this.connections[c]&&(0<this.connections[c].congestion?("DATA"===b&&this.connections[c].congestion--,this.wispws.send(a)):(this.connections[c].congested=!0,this.congested_buffer.push({data:a,type:b})))};ac.prototype.process_incoming_wisp_frame=function(a){const b=
|
|
225
|
+
new DataView(a.buffer),c=b.getUint32(1,!0);switch(a[0]){case 1:B("Server sent client-only packet CONNECT",1048576);break;case 2:if(this.connections[c])this.connections[c].data_callback(a.slice(5));else throw Error("Got a DATA packet but stream not registered. ID: "+c);break;case 3:this.connections[c]&&(this.connections[c].congestion=b.getUint32(5,!0));if(this.connections[c].congested){for(const d of this.congested_buffer)this.send_packet(d.data,d.type,c);this.connections[c].congested=!1}break;case 4:this.connections[c]&&
|
|
226
|
+
this.connections[c].close_callback(b.getUint8(5));delete this.connections[c];break;case 5:B("got a wisp V2 upgrade request, ignoring",1048576);break;default:B("Wisp server returned unknown packet: "+a[0],1048576)}};ac.prototype.send_wisp_frame=function(a){let b,c;switch(a.type){case "CONNECT":const d=(new TextEncoder).encode(a.hostname);b=new Uint8Array(8+d.length);c=new DataView(b.buffer);c.setUint8(0,1);c.setUint32(1,a.stream_id,!0);c.setUint8(5,1);c.setUint16(6,a.port,!0);b.set(d,8);this.connections[a.stream_id]=
|
|
227
|
+
{data_callback:a.data_callback,close_callback:a.close_callback,congestion:this.connections[0].congestion};break;case "DATA":b=new Uint8Array(5+a.data.length);c=new DataView(b.buffer);c.setUint8(0,2);c.setUint32(1,a.stream_id,!0);b.set(a.data,5);break;case "CLOSE":b=new Uint8Array(6);c=new DataView(b.buffer);c.setUint8(0,4);c.setUint32(1,a.stream_id,!0);c.setUint8(5,a.reason);break;default:B("Client tried to send unknown packet: "+a.type,1048576)}this.send_packet(b,a.type,a.stream_id)};ac.prototype.destroy=
|
|
228
|
+
function(){this.wispws&&(this.wispws.onmessage=null,this.wispws.onclose=null,this.wispws.close(),this.wispws=null)};ac.prototype.on_tcp_connection=function(a,b){let c=new Xb;c.state="syn-received";c.net=this;c.tuple=b;c.stream_id=this.last_stream++;this.tcp_conn[b]=c;c.on("data",d=>{0!==d.length&&this.send_wisp_frame({type:"DATA",stream_id:c.stream_id,data:d})});c.on_close=()=>{this.send_wisp_frame({type:"CLOSE",stream_id:c.stream_id,reason:2})};c.on_shutdown=c.on_close;this.send_wisp_frame({type:"CONNECT",
|
|
229
|
+
stream_id:c.stream_id,hostname:a.ipv4.dest.join("."),port:a.tcp.dport,data_callback:d=>{c.write(d)},close_callback:()=>{c.close()}});c.accept(a);return!0};ac.prototype.send=function(a){Ub(a,this)};ac.prototype.receive=function(a){this.bus.send("net"+this.id+"-receive",new Uint8Array(a))};const bc="undefined"!==typeof window&&0<=window.navigator.platform.toString().toLowerCase().search("win");function cc(a){function b(x){return x.shiftKey&&x.ctrlKey&&(73===x.keyCode||74===x.keyCode||75===x.keyCode)||
|
|
230
|
+
!z.emu_enabled?!1:x.target?x.target.classList.contains("phone_keyboard")||"INPUT"!==x.target.nodeName&&"TEXTAREA"!==x.target.nodeName:!0}function c(x){!x.altKey&&q[56]&&m(56,!1);return g(x,!1)}function d(x){!x.altKey&&q[56]&&m(56,!1);return g(x,!0)}function e(){for(var x=Object.keys(q),N,V=0;V<x.length;V++)N=+x[V],q[N]&&m(N,!1);q={}}function f(x){if(z.bus&&b(x))switch(x.inputType){case "insertText":for(var N=0;N<x.data.length;N++)z.simulate_char(x.data[N]);break;case "insertLineBreak":z.simulate_press(13);
|
|
231
|
+
break;case "deleteContentBackward":z.simulate_press(8)}}function g(x,N){if(z.bus&&b(x)&&""!==x.code&&"Process"!==x.key&&"Unidentified"!==x.key&&229!==x.keyCode){x.preventDefault&&x.preventDefault();if(bc&&(r&&(clearTimeout(t),x.getModifierState&&x.getModifierState("AltGraph")&&v===N&&"ControlLeft"===r.code&&"AltRight"===x.code||k(r,v),r=null),"ControlLeft"===x.code))return r=x,v=N,t=setTimeout(()=>{k(r,v);r=null},10),!1;k(x,N);return!1}}function k(x,N){a:{if(void 0!==x.code){var V=F[x.code];if(void 0!==
|
|
232
|
+
V)break a}V=A[x.keyCode]}V?m(V,N,x.repeat):console.log("Missing char in map: keyCode="+(x.keyCode||-1).toString(16)+" code="+x.code)}function m(x,N,V){if(N)q[x]&&!V&&m(x,!1);else if(!q[x])return;(q[x]=N)||(x|=128);255<x?(p(x>>8),p(x&255)):p(x)}function p(x){z.bus.send("keyboard-code",x)}var q={},r=null,v=!1,t=0,z=this;this.emu_enabled=!0;const A=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,
|
|
233
|
+
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]),u={8:8,10:13,32:32,39:222,44:188,
|
|
234
|
+
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},E={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,
|
|
235
|
+
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};var F={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,
|
|
236
|
+
Backslash:43,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Comma:51,Period:52,Slash:53,IntlRo: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,
|
|
237
|
+
AltRight:57400,Home:57415,ArrowUp:57416,PageUp:57417,ArrowLeft:57419,ArrowRight:57421,End:57423,ArrowDown:57424,PageDown:57425,Insert:57426,Delete:57427,MetaLeft:57435,OSLeft:57435,MetaRight:57436,OSRight:57436,ContextMenu:57437};this.bus=a;this.destroy=function(){"undefined"!==typeof window&&(window.removeEventListener("keyup",c,!1),window.removeEventListener("keydown",d,!1),window.removeEventListener("blur",e,!1),window.removeEventListener("input",f,!1))};this.init=function(){"undefined"!==typeof window&&
|
|
238
|
+
(this.destroy(),window.addEventListener("keyup",c,!1),window.addEventListener("keydown",d,!1),window.addEventListener("blur",e,!1),window.addEventListener("input",f,!1))};this.init();this.simulate_press=function(x){x={keyCode:x};g(x,!0);g(x,!1)};this.simulate_char=function(x){var N=x.charCodeAt(0);N in u?this.simulate_press(u[N]):N in E?(p(42),this.simulate_press(E[N]),p(170)):console.log("ascii -> keyCode not found: ",N,x)}}function dc(a,b){function c(u){if(!A.enabled||!A.emu_enabled)return!1;var E=
|
|
239
|
+
b||document.body,F;if(!(F=document.pointerLockElement))a:{for(u=u.target;u.parentNode;){if(u===E){F=!0;break a}u=u.parentNode}F=!1}return F}function d(u){c(u)&&(u=u.changedTouches)&&u.length&&(u=u[u.length-1],t=u.clientX,z=u.clientY)}function e(){if(q||v||r)A.bus.send("mouse-click",[!1,!1,!1]),q=v=r=!1}function f(u){if(A.bus&&c(u)&&A.is_running){var E=0,F=0,x=u.changedTouches;x?x.length&&(x=x[x.length-1],E=x.clientX-t,F=x.clientY-z,t=x.clientX,z=x.clientY,u.preventDefault()):"number"===typeof u.movementX?
|
|
240
|
+
(E=u.movementX,F=u.movementY):"number"===typeof u.webkitMovementX?(E=u.webkitMovementX,F=u.webkitMovementY):"number"===typeof u.mozMovementX?(E=u.mozMovementX,F=u.mozMovementY):(E=u.clientX-t,F=u.clientY-z,t=u.clientX,z=u.clientY);A.bus.send("mouse-delta",[1*E,-(1*F)]);b&&A.bus.send("mouse-absolute",[u.pageX-b.offsetLeft,u.pageY-b.offsetTop,b.offsetWidth,b.offsetHeight])}}function g(u){c(u)&&m(u,!0)}function k(u){c(u)&&m(u,!1)}function m(u,E){A.bus&&(1===u.which?q=E:2===u.which?v=E:3===u.which?r=
|
|
241
|
+
E:B("Unknown event.which: "+u.which),A.bus.send("mouse-click",[q,v,r]),u.preventDefault())}function p(u){if(c(u)){var E=u.wheelDelta||-u.detail;0>E?E=-1:0<E&&(E=1);A.bus.send("mouse-wheel",[E,0]);u.preventDefault()}}var q=!1,r=!1,v=!1,t=0,z=0,A=this;this.enabled=!1;this.emu_enabled=!0;this.bus=a;this.bus.register("mouse-enable",function(u){this.enabled=u},this);this.is_running=!1;this.bus.register("emulator-stopped",function(){this.is_running=!1},this);this.bus.register("emulator-started",function(){this.is_running=
|
|
242
|
+
!0},this);this.destroy=function(){"undefined"!==typeof window&&(window.removeEventListener("touchstart",d,!1),window.removeEventListener("touchend",e,!1),window.removeEventListener("touchmove",f,!1),window.removeEventListener("mousemove",f,!1),window.removeEventListener("mousedown",g,!1),window.removeEventListener("mouseup",k,!1),window.removeEventListener("wheel",p,{passive:!1}))};this.init=function(){"undefined"!==typeof window&&(this.destroy(),window.addEventListener("touchstart",d,!1),window.addEventListener("touchend",
|
|
243
|
+
e,!1),window.addEventListener("touchmove",f,!1),window.addEventListener("mousemove",f,!1),window.addEventListener("mousedown",g,!1),window.addEventListener("mouseup",k,!1),window.addEventListener("wheel",p,{passive:!1}))};this.init()}function ec(){var a,b=0,c=0;this.put_char=function(d,e,f){l(0<=d&&d<c);l(0<=e&&e<b);a[d*b+e]=f};this.destroy=function(){};this.pause=function(){};this.continue=function(){};this.set_mode=function(){};this.set_font_bitmap=function(){};this.set_font_page=function(){};this.clear_screen=
|
|
244
|
+
function(){};this.set_size_text=function(d,e){if(d!==b||e!==c)a=new Uint8Array(d*e),b=d,c=e};this.set_size_graphical=function(){};this.set_scale=function(){};this.update_cursor_scanline=function(){};this.update_cursor=function(){};this.update_buffer=function(){};this.get_text_screen=function(){for(var d=[],e=0;e<c;e++)d.push(this.get_text_row(e));return d};this.get_text_row=function(d){d*=b;return String.fromCharCode.apply(String,a.subarray(d,d+b))};this.set_size_text(80,25)}function lc(a,b){function c(k){g.bus&&
|
|
245
|
+
g.enabled&&(g.send_char(k.which),k.preventDefault())}function d(k){var m=k.which;8===m?(g.send_char(127),k.preventDefault()):9===m&&(g.send_char(9),k.preventDefault())}function e(k){if(g.enabled){for(var m=k.clipboardData.getData("text/plain"),p=0;p<m.length;p++)g.send_char(m.charCodeAt(p));k.preventDefault()}}function f(k){k.target!==a&&a.blur()}var g=this;this.enabled=!0;this.bus=b;this.text="";this.text_new_line=!1;this.last_update=0;this.bus.register("serial0-output-byte",function(k){k=String.fromCharCode(k);
|
|
246
|
+
this.show_char(k)},this);this.destroy=function(){a.removeEventListener("keypress",c,!1);a.removeEventListener("keydown",d,!1);a.removeEventListener("paste",e,!1);window.removeEventListener("mousedown",f,!1)};this.init=function(){this.destroy();a.style.display="block";a.addEventListener("keypress",c,!1);a.addEventListener("keydown",d,!1);a.addEventListener("paste",e,!1);window.addEventListener("mousedown",f,!1)};this.init();this.show_char=function(k){"\b"===k?(this.text=this.text.slice(0,-1),this.update()):
|
|
247
|
+
"\r"!==k&&(this.text+=k,"\n"===k&&(this.text_new_line=!0),this.update())};this.update=function(){var k=Date.now(),m=k-this.last_update;16>m?void 0===this.update_timer&&(this.update_timer=setTimeout(()=>{this.update_timer=void 0;var p=Date.now();l(15<=p-this.last_update);this.last_update=p;this.render()},16-m)):(void 0!==this.update_timer&&(clearTimeout(this.update_timer),this.update_timer=void 0),this.last_update=k,this.render())};this.render=function(){a.value=this.text;this.text_new_line&&(this.text_new_line=
|
|
248
|
+
!1,a.scrollTop=1E9)};this.send_char=function(k){g.bus&&g.bus.send("serial0-input",k)}}function mc(a,b){this.element=a;if(window.Terminal){var c=this.term=new window.Terminal({logLevel:"off",convertEol:"true"});c.write("This is the serial console. Whatever you type or paste here will be sent to COM1");var d=c.onData(function(e){for(let f=0;f<e.length;f++)b.send("serial0-input",e.charCodeAt(f))});b.register("serial0-output-byte",function(e){c.write(Uint8Array.of(e))},this);this.destroy=function(){d.dispose();
|
|
249
|
+
c.dispose()}}}mc.prototype.show=function(){this.term&&this.term.open(this.element)};function nc(a,b){b=b.id||0;this.bus=a;this.bus_send_msgid=`net${b}-send`;this.bus_recv_msgid=`net${b}-receive`;this.channel=new BroadcastChannel(`v86-inbrowser-${b}`);this.is_open=!0;this.nic_to_hub_fn=c=>{this.channel.postMessage(c)};this.bus.register(this.bus_send_msgid,this.nic_to_hub_fn,this);this.hub_to_nic_fn=c=>{this.bus.send(this.bus_recv_msgid,c.data)};this.channel.addEventListener("message",this.hub_to_nic_fn)}
|
|
250
|
+
nc.prototype.destroy=function(){this.is_open&&(this.bus.unregister(this.bus_send_msgid,this.nic_to_hub_fn),this.channel.removeEventListener("message",this.hub_to_nic_fn),this.channel.close(),this.is_open=!1)};function oc(){this.filedata=new Map}oc.prototype.read=async function(a,b,c){l(a,"MemoryFileStorage read: sha256sum should be a non-empty string");return(a=this.filedata.get(a))?a.subarray(b,b+c):null};oc.prototype.cache=async function(a,b){l(a,"MemoryFileStorage cache: sha256sum should be a non-empty string");
|
|
251
|
+
this.filedata.set(a,b)};oc.prototype.uncache=function(a){this.filedata.delete(a)};function pc(a,b){l(b,"ServerMemoryFileStorage: baseurl should not be empty");b.endsWith("/")||(b+="/");this.storage=a;this.baseurl=b}pc.prototype.load_from_server=function(a){return new Promise(b=>{ta(this.baseurl+a,{done:async c=>{c=new Uint8Array(c);await this.cache(a,c);b(c)}})})};pc.prototype.read=async function(a,b,c){const d=await this.storage.read(a,b,c);return d?d:(await this.load_from_server(a)).subarray(b,
|
|
252
|
+
b+c)};pc.prototype.cache=async function(a,b){return await this.storage.cache(a,b)};pc.prototype.uncache=function(a){this.storage.uncache(a)};const qc=new TextDecoder,rc=new TextEncoder;function J(a,b,c,d){for(var e,f=0,g=0;g<a.length;g++)switch(e=b[g],a[g]){case "w":c[d++]=e&255;c[d++]=e>>8&255;c[d++]=e>>16&255;c[d++]=e>>24&255;f+=4;break;case "d":c[d++]=e&255;c[d++]=e>>8&255;c[d++]=e>>16&255;c[d++]=e>>24&255;c[d++]=0;c[d++]=0;c[d++]=0;c[d++]=0;f+=8;break;case "h":c[d++]=e&255;c[d++]=e>>8;f+=2;break;
|
|
253
|
+
case "b":c[d++]=e;f+=1;break;case "s":var k=d,m=0;c[d++]=0;c[d++]=0;f+=2;e=rc.encode(e);f+=e.byteLength;m+=e.byteLength;c.set(e,d);d+=e.byteLength;c[k+0]=m&255;c[k+1]=m>>8&255;break;case "Q":J(["b","w","d"],[e.type,e.version,e.path],c,d);d+=13;f+=13;break;default:B("Marshall: Unknown type="+a[g])}return f}function K(a,b,c){let d=c.offset;for(var e=[],f=0;f<a.length;f++)switch(a[f]){case "w":var g=b[d++];g+=b[d++]<<8;g+=b[d++]<<16;g+=b[d++]<<24>>>0;e.push(g);break;case "d":g=b[d++];g+=b[d++]<<8;g+=
|
|
254
|
+
b[d++]<<16;g+=b[d++]<<24>>>0;d+=4;e.push(g);break;case "h":g=b[d++];e.push(g+(b[d++]<<8));break;case "b":e.push(b[d++]);break;case "s":g=b[d++];g+=b[d++]<<8;var k=b.slice(d,d+g);d+=g;e.push(qc.decode(k));break;case "Q":c.offset=d;g=K(["b","w","d"],b,c);d=c.offset;e.push({type:g[0],version:g[1],path:g[2]});break;default:B("Error in Unmarshall: Unknown type="+a[f])}c.offset=d;return e}const sc=new TextEncoder;function L(a,b){this.inodes=[];this.storage=a;this.qidcounter=b||{last_qidnumber:0};this.inodedata=
|
|
255
|
+
{};this.total_size=274877906944;this.used_size=0;this.mounts=[];this.CreateDirectory("",-1)}L.prototype.get_state=function(){let a=[];a[0]=this.inodes;a[1]=this.qidcounter.last_qidnumber;a[2]=[];for(const [b,c]of Object.entries(this.inodedata))0===(this.inodes[b].mode&16384)&&a[2].push([b,c]);a[3]=this.total_size;a[4]=this.used_size;return a=a.concat(this.mounts)};L.prototype.set_state=function(a){this.inodes=a[0].map(b=>{const c=new tc(0);c.set_state(b);return c});this.qidcounter.last_qidnumber=
|
|
256
|
+
a[1];this.inodedata={};for(let [b,c]of a[2])c.buffer.byteLength!==c.byteLength&&(c=c.slice()),this.inodedata[b]=c;this.total_size=a[3];this.used_size=a[4];this.mounts=a.slice(5)};L.prototype.load_from_json=function(a){l(a,"Invalid fs passed to load_from_json");if(3!==a.version)throw"The filesystem JSON format has changed. Please recreate the filesystem JSON.";var b=a.fsroot;this.used_size=a.size;for(a=0;a<b.length;a++)this.LoadRecursive(b[a],0)};L.prototype.LoadRecursive=function(a,b){var c=this.CreateInode();
|
|
257
|
+
const d=a[0];c.size=a[1];c.mtime=a[2];c.ctime=c.mtime;c.atime=c.mtime;c.mode=a[3];c.uid=a[4];c.gid=a[5];var e=c.mode&61440;16384===e?(this.PushInode(c,b,d),this.LoadDir(this.inodes.length-1,a[6])):32768===e?(c.status=2,c.sha256sum=a[6],l(c.sha256sum),this.PushInode(c,b,d)):40960===e?(c.symlink=a[6],this.PushInode(c,b,d)):49152!==e&&B("Unexpected ifmt: "+n(e)+" ("+d+")",4194304)};L.prototype.LoadDir=function(a,b){for(var c=0;c<b.length;c++)this.LoadRecursive(b[c],a)};L.prototype.should_be_linked=function(a){return!this.is_forwarder(a)||
|
|
258
|
+
0===a.foreign_id};L.prototype.link_under_dir=function(a,b,c){const d=this.inodes[b],e=this.inodes[a];l(!this.is_forwarder(e),"Filesystem: Shouldn't link under fowarder parents");l(this.IsDirectory(a),"Filesystem: Can't link under non-directories");l(this.should_be_linked(d),"Filesystem: Can't link across filesystems apart from their root");l(0<=d.nlinks,"Filesystem: Found negative nlinks value of "+d.nlinks);l(!e.direntries.has(c),"Filesystem: Name '"+c+"' is already taken");e.direntries.set(c,b);
|
|
259
|
+
d.nlinks++;this.IsDirectory(b)&&(l(!d.direntries.has(".."),"Filesystem: Cannot link a directory twice"),d.direntries.has(".")||d.nlinks++,d.direntries.set(".",b),d.direntries.set("..",a),e.nlinks++)};L.prototype.unlink_from_dir=function(a,b){const c=this.Search(a,b),d=this.inodes[c],e=this.inodes[a];l(!this.is_forwarder(e),"Filesystem: Can't unlink from forwarders");l(this.IsDirectory(a),"Filesystem: Can't unlink from non-directories");e.direntries.delete(b)?(d.nlinks--,this.IsDirectory(c)&&(l(d.direntries.get("..")===
|
|
260
|
+
a,"Filesystem: Found directory with bad parent id"),d.direntries.delete(".."),e.nlinks--),l(0<=d.nlinks,"Filesystem: Found negative nlinks value of "+d.nlinks)):l(!1,"Filesystem: Can't unlink non-existent file: "+b)};L.prototype.PushInode=function(a,b,c){-1!==b?(this.inodes.push(a),a.fid=this.inodes.length-1,this.link_under_dir(b,a.fid,c)):0===this.inodes.length?(this.inodes.push(a),a.direntries.set(".",0),a.direntries.set("..",0),a.nlinks=2):l(!1,"Error in Filesystem: Pushed inode with name = "+
|
|
261
|
+
c+" has no parent")};function tc(a){this.direntries=new Map;this.minor=this.major=this.mtime=this.atime=this.ctime=this.fid=this.gid=this.uid=this.size=this.status=0;this.symlink="";this.mode=493;this.qid={type:0,version:0,path:a};this.caps=void 0;this.nlinks=0;this.sha256sum="";this.locks=[];this.foreign_id=this.mount_id=-1}tc.prototype.get_state=function(){const a=[];a[0]=this.mode;a[1]=16384===(this.mode&61440)?[...this.direntries]:32768===(this.mode&61440)?this.sha256sum:40960===(this.mode&61440)?
|
|
262
|
+
this.symlink:49152===(this.mode&61440)?[this.minor,this.major]:null;a[2]=this.locks;a[3]=this.status;a[4]=this.size;a[5]=this.uid;a[6]=this.gid;a[7]=this.fid;a[8]=this.ctime;a[9]=this.atime;a[10]=this.mtime;a[11]=this.qid.version;a[12]=this.qid.path;a[13]=this.nlinks;return a};tc.prototype.set_state=function(a){this.mode=a[0];if(16384===(this.mode&61440)){this.direntries=new Map;for(const [b,c]of a[1])this.direntries.set(b,c)}else 32768===(this.mode&61440)?this.sha256sum=a[1]:40960===(this.mode&61440)?
|
|
263
|
+
this.symlink=a[1]:49152===(this.mode&61440)&&([this.minor,this.major]=a[1]);this.locks=[];for(const b of a[2]){const c=new uc;c.set_state(b);this.locks.push(c)}this.status=a[3];this.size=a[4];this.uid=a[5];this.gid=a[6];this.fid=a[7];this.ctime=a[8];this.atime=a[9];this.mtime=a[10];this.qid.type=(this.mode&61440)>>8;this.qid.version=a[11];this.qid.path=a[12];this.nlinks=a[13]};L.prototype.divert=function(a,b){const c=this.Search(a,b),d=this.inodes[c],e=new tc(-1);l(d,"Filesystem divert: name ("+b+
|
|
264
|
+
") not found");l(this.IsDirectory(c)||1>=d.nlinks,"Filesystem: can't divert hardlinked file '"+b+"' with nlinks="+d.nlinks);Object.assign(e,d);const f=this.inodes.length;this.inodes.push(e);e.fid=f;this.is_forwarder(d)&&this.mounts[d.mount_id].backtrack.set(d.foreign_id,f);this.should_be_linked(d)&&(this.unlink_from_dir(a,b),this.link_under_dir(a,f,b));if(this.IsDirectory(c)&&!this.is_forwarder(d))for(const [g,k]of e.direntries)"."!==g&&".."!==g&&this.IsDirectory(k)&&this.inodes[k].direntries.set("..",
|
|
265
|
+
f);this.inodedata[f]=this.inodedata[c];delete this.inodedata[c];d.direntries=new Map;d.nlinks=0;return f};L.prototype.copy_inode=function(a,b){Object.assign(b,a,{fid:b.fid,direntries:b.direntries,nlinks:b.nlinks})};L.prototype.CreateInode=function(){const a=Math.round(Date.now()/1E3),b=new tc(++this.qidcounter.last_qidnumber);b.atime=b.ctime=b.mtime=a;return b};L.prototype.CreateDirectory=function(a,b){var c=this.inodes[b];if(0<=b&&this.is_forwarder(c))return b=c.foreign_id,a=this.follow_fs(c).CreateDirectory(a,
|
|
266
|
+
b),this.create_forwarder(c.mount_id,a);c=this.CreateInode();c.mode=16895;0<=b&&(c.uid=this.inodes[b].uid,c.gid=this.inodes[b].gid,c.mode=this.inodes[b].mode&511|16384);c.qid.type=64;this.PushInode(c,b,a);this.NotifyListeners(this.inodes.length-1,"newdir");return this.inodes.length-1};L.prototype.CreateFile=function(a,b){var c=this.inodes[b];if(this.is_forwarder(c))return b=c.foreign_id,a=this.follow_fs(c).CreateFile(a,b),this.create_forwarder(c.mount_id,a);c=this.CreateInode();c.uid=this.inodes[b].uid;
|
|
267
|
+
c.gid=this.inodes[b].gid;c.qid.type=128;c.mode=this.inodes[b].mode&438|32768;this.PushInode(c,b,a);this.NotifyListeners(this.inodes.length-1,"newfile");return this.inodes.length-1};L.prototype.CreateNode=function(a,b,c,d){var e=this.inodes[b];if(this.is_forwarder(e))return b=e.foreign_id,a=this.follow_fs(e).CreateNode(a,b,c,d),this.create_forwarder(e.mount_id,a);e=this.CreateInode();e.major=c;e.minor=d;e.uid=this.inodes[b].uid;e.gid=this.inodes[b].gid;e.qid.type=192;e.mode=this.inodes[b].mode&438;
|
|
268
|
+
this.PushInode(e,b,a);return this.inodes.length-1};L.prototype.CreateSymlink=function(a,b,c){var d=this.inodes[b];if(this.is_forwarder(d))return b=d.foreign_id,a=this.follow_fs(d).CreateSymlink(a,b,c),this.create_forwarder(d.mount_id,a);d=this.CreateInode();d.uid=this.inodes[b].uid;d.gid=this.inodes[b].gid;d.qid.type=160;d.symlink=c;d.mode=40960;this.PushInode(d,b,a);return this.inodes.length-1};L.prototype.CreateTextFile=async function(a,b,c){var d=this.inodes[b];if(this.is_forwarder(d))return b=
|
|
269
|
+
d.foreign_id,c=await this.follow_fs(d).CreateTextFile(a,b,c),this.create_forwarder(d.mount_id,c);d=this.CreateFile(a,b);b=this.inodes[d];a=new Uint8Array(c.length);b.size=c.length;for(b=0;b<c.length;b++)a[b]=c.charCodeAt(b);await this.set_data(d,a);return d};L.prototype.CreateBinaryFile=async function(a,b,c){var d=this.inodes[b];if(this.is_forwarder(d))return b=d.foreign_id,c=await this.follow_fs(d).CreateBinaryFile(a,b,c),this.create_forwarder(d.mount_id,c);d=this.CreateFile(a,b);a=this.inodes[d];
|
|
270
|
+
b=new Uint8Array(c.length);b.set(c);await this.set_data(d,b);a.size=c.length;return d};L.prototype.OpenInode=async function(a,b){var c=this.inodes[a];if(this.is_forwarder(c))return await this.follow_fs(c).OpenInode(c.foreign_id,b);16384===(c.mode&61440)&&this.FillDirectory(a)};L.prototype.CloseInode=async function(a){var b=this.inodes[a];if(this.is_forwarder(b))return await this.follow_fs(b).CloseInode(b.foreign_id);2===b.status&&this.storage.uncache(b.sha256sum);4===b.status&&(b.status=-1,await this.DeleteData(a))};
|
|
271
|
+
L.prototype.Rename=async function(a,b,c,d){if(a===c&&b===d)return 0;var e=this.Search(a,b);if(-1===e)return-2;var f=this.GetFullPath(a)+"/"+b;if(-1!==this.Search(c,d)){var g=this.Unlink(c,d);if(0>g)return g}var k=this.inodes[e],m=this.inodes[a];g=this.inodes[c];if(this.is_forwarder(m)||this.is_forwarder(g))if(this.is_forwarder(m)&&m.mount_id===g.mount_id){if(a=await this.follow_fs(m).Rename(m.foreign_id,b,g.foreign_id,d),0>a)return a}else{if(this.is_a_root(e))return B("XXX: Attempted to move mountpoint ("+
|
|
272
|
+
b+") - skipped",4194304),-1;if(!this.IsDirectory(e)&&1<this.GetInode(e).nlinks)return B("XXX: Attempted to move hardlinked file ("+b+") across filesystems - skipped",4194304),-1;m=this.divert(a,b);const p=this.GetInode(e),q=await this.Read(m,0,p.size);this.is_forwarder(g)?(c=this.follow_fs(g),d=this.IsDirectory(m)?c.CreateDirectory(d,g.foreign_id):c.CreateFile(d,g.foreign_id),c=c.GetInode(d),this.copy_inode(p,c),this.set_forwarder(e,g.mount_id,d)):(this.delete_forwarder(k),this.copy_inode(p,k),this.link_under_dir(c,
|
|
273
|
+
e,d));await this.ChangeSize(e,p.size);q&&q.length&&await this.Write(e,0,q.length,q);if(this.IsDirectory(e))for(const r of this.GetChildren(m))if(g=await this.Rename(m,r,e,r),0>g)return g;await this.DeleteData(m);a=this.Unlink(a,b);if(0>a)return a}else this.unlink_from_dir(a,b),this.link_under_dir(c,e,d),k.qid.version++;this.NotifyListeners(e,"rename",{oldpath:f});return 0};L.prototype.Write=async function(a,b,c,d){this.NotifyListeners(a,"write");var e=this.inodes[a];if(this.is_forwarder(e))a=e.foreign_id,
|
|
274
|
+
await this.follow_fs(e).Write(a,b,c,d);else{var f=await this.get_buffer(a);!f||f.length<b+c?(await this.ChangeSize(a,Math.floor(3*(b+c)/2)),e.size=b+c,f=await this.get_buffer(a)):e.size<b+c&&(e.size=b+c);d&&f.set(d.subarray(0,c),b);await this.set_data(a,f)}};L.prototype.Read=async function(a,b,c){const d=this.inodes[a];return this.is_forwarder(d)?(a=d.foreign_id,await this.follow_fs(d).Read(a,b,c)):await this.get_data(a,b,c)};L.prototype.Search=function(a,b){a=this.inodes[a];if(this.is_forwarder(a)){const c=
|
|
275
|
+
a.foreign_id;b=this.follow_fs(a).Search(c,b);return-1===b?-1:this.get_forwarder(a.mount_id,b)}b=a.direntries.get(b);return void 0===b?-1:b};L.prototype.CountUsedInodes=function(){let a=this.inodes.length;for(const {fs:b,backtrack:c}of this.mounts)a+=b.CountUsedInodes(),a-=c.size;return a};L.prototype.CountFreeInodes=function(){let a=1048576;for(const {fs:b}of this.mounts)a+=b.CountFreeInodes();return a};L.prototype.GetTotalSize=function(){let a=this.used_size;for(const {fs:b}of this.mounts)a+=b.GetTotalSize();
|
|
276
|
+
return a};L.prototype.GetSpace=function(){let a=this.total_size;for(const {fs:b}of this.mounts)a+=b.GetSpace();return this.total_size};L.prototype.GetDirectoryName=function(a){const b=this.inodes[this.GetParent(a)];if(this.is_forwarder(b))return this.follow_fs(b).GetDirectoryName(this.inodes[a].foreign_id);if(!b)return"";for(const [c,d]of b.direntries)if(d===a)return c;l(!1,"Filesystem: Found directory inode whose parent doesn't link to it");return""};L.prototype.GetFullPath=function(a){l(this.IsDirectory(a),
|
|
277
|
+
"Filesystem: Cannot get full path of non-directory inode");for(var b="";0!==a;)b="/"+this.GetDirectoryName(a)+b,a=this.GetParent(a);return b.substring(1)};L.prototype.Link=function(a,b,c){if(this.IsDirectory(b))return-1;const d=this.inodes[a],e=this.inodes[b];if(this.is_forwarder(d))return this.is_forwarder(e)&&e.mount_id===d.mount_id?this.follow_fs(d).Link(d.foreign_id,e.foreign_id,c):(B("XXX: Attempted to hardlink a file into a child filesystem - skipped",4194304),-1);if(this.is_forwarder(e))return B("XXX: Attempted to hardlink file across filesystems - skipped",
|
|
278
|
+
4194304),-1;this.link_under_dir(a,b,c);return 0};L.prototype.Unlink=function(a,b){if("."===b||".."===b)return-1;const c=this.Search(a,b),d=this.inodes[c],e=this.inodes[a];if(this.is_forwarder(e))return l(this.is_forwarder(d),"Children of forwarders should be forwarders"),a=e.foreign_id,this.follow_fs(e).Unlink(a,b);if(this.IsDirectory(c)&&!this.IsEmpty(c))return-39;this.unlink_from_dir(a,b);0===d.nlinks&&(d.status=4,this.NotifyListeners(c,"delete"));return 0};L.prototype.DeleteData=async function(a){const b=
|
|
279
|
+
this.inodes[a];this.is_forwarder(b)?await this.follow_fs(b).DeleteData(b.foreign_id):(b.size=0,delete this.inodedata[a])};L.prototype.get_buffer=async function(a){const b=this.inodes[a];l(b,`Filesystem get_buffer: idx ${a} does not point to an inode`);return this.inodedata[a]?this.inodedata[a]:2===b.status?(l(b.sha256sum,"Filesystem get_data: found inode on server without sha256sum"),await this.storage.read(b.sha256sum,0,b.size)):null};L.prototype.get_data=async function(a,b,c){const d=this.inodes[a];
|
|
280
|
+
l(d,`Filesystem get_data: idx ${a} does not point to an inode`);return this.inodedata[a]?this.inodedata[a].subarray(b,b+c):2===d.status?(l(d.sha256sum,"Filesystem get_data: found inode on server without sha256sum"),await this.storage.read(d.sha256sum,b,c)):null};L.prototype.set_data=async function(a,b){this.inodedata[a]=b;2===this.inodes[a].status&&(this.inodes[a].status=0,this.storage.uncache(this.inodes[a].sha256sum))};L.prototype.GetInode=function(a){l(!isNaN(a),"Filesystem GetInode: NaN idx");
|
|
281
|
+
l(0<=a&&a<this.inodes.length,"Filesystem GetInode: out of range idx:"+a);a=this.inodes[a];return this.is_forwarder(a)?this.follow_fs(a).GetInode(a.foreign_id):a};L.prototype.ChangeSize=async function(a,b){var c=this.GetInode(a),d=await this.get_data(a,0,c.size);if(b!==c.size){var e=new Uint8Array(b);c.size=b;d&&e.set(d.subarray(0,Math.min(d.length,c.size)),0);await this.set_data(a,e)}};L.prototype.SearchPath=function(a){a=a.replace("//","/");a=a.split("/");0<a.length&&0===a[a.length-1].length&&a.pop();
|
|
282
|
+
0<a.length&&0===a[0].length&&a.shift();const b=a.length;var c=-1,d=0;let e=null;for(var f=0;f<b;f++)if(c=d,d=this.Search(c,a[f]),!e&&this.is_forwarder(this.inodes[c])&&(e="/"+a.slice(f).join("/")),-1===d)return f<b-1?{id:-1,parentid:-1,name:a[f],forward_path:e}:{id:-1,parentid:c,name:a[f],forward_path:e};return{id:d,parentid:c,name:a[f],forward_path:e}};L.prototype.GetRecursiveList=function(a,b){if(this.is_forwarder(this.inodes[a])){const c=this.follow_fs(this.inodes[a]),d=this.inodes[a].mount_id,
|
|
283
|
+
e=b.length;c.GetRecursiveList(this.inodes[a].foreign_id,b);for(a=e;a<b.length;a++)b[a].parentid=this.get_forwarder(d,b[a].parentid)}else for(const [c,d]of this.inodes[a].direntries)"."!==c&&".."!==c&&(b.push({parentid:a,name:c}),this.IsDirectory(d)&&this.GetRecursiveList(d,b))};L.prototype.RecursiveDelete=function(a){var b=[];a=this.SearchPath(a);if(-1!==a.id)for(this.GetRecursiveList(a.id,b),a=b.length-1;0<=a;a--){const c=this.Unlink(b[a].parentid,b[a].name);l(0===c,"Filesystem RecursiveDelete failed at parent="+
|
|
284
|
+
b[a].parentid+", name='"+b[a].name+"' with error code: "+-c)}};L.prototype.DeleteNode=function(a){var b=this.SearchPath(a);-1!==b.id&&(32768===(this.inodes[b.id].mode&61440)?(a=this.Unlink(b.parentid,b.name),l(0===a,"Filesystem DeleteNode failed with error code: "+-a)):16384===(this.inodes[b.id].mode&61440)&&(this.RecursiveDelete(a),a=this.Unlink(b.parentid,b.name),l(0===a,"Filesystem DeleteNode failed with error code: "+-a)))};L.prototype.NotifyListeners=function(){};L.prototype.Check=function(){for(var a=
|
|
285
|
+
1;a<this.inodes.length;a++)if(-1!==this.inodes[a].status){var b=this.GetInode(a);0>b.nlinks&&B("Error in filesystem: negative nlinks="+b.nlinks+" at id ="+a,4194304);if(this.IsDirectory(a)){b=this.GetInode(a);this.IsDirectory(a)&&0>this.GetParent(a)&&B("Error in filesystem: negative parent id "+a,4194304);for(const [c,d]of b.direntries){0===c.length&&B("Error in filesystem: inode with no name and id "+d,4194304);for(const e of c)32>e&&B("Error in filesystem: Unallowed char in filename",4194304)}}}};
|
|
286
|
+
L.prototype.FillDirectory=function(a){var b=this.inodes[a];if(this.is_forwarder(b))this.follow_fs(b).FillDirectory(b.foreign_id);else{var c=0;for(const d of b.direntries.keys())c+=24+sc.encode(d).length;a=this.inodedata[a]=new Uint8Array(c);b.size=c;c=0;for(const [d,e]of b.direntries)b=this.GetInode(e),c+=J(["Q","d","b","s"],[b.qid,c+13+8+1+2+sc.encode(d).length,b.mode>>12,d],a,c)}};L.prototype.RoundToDirentry=function(a,b){const c=this.inodedata[a];l(c,`FS directory data for dirid=${a} should be generated`);
|
|
287
|
+
l(c.length,"FS directory should have at least an entry");if(b>=c.length)return c.length;for(a=0;;){const d=K(["Q","d"],c,{offset:a})[1];if(d>b)break;a=d}return a};L.prototype.IsDirectory=function(a){a=this.inodes[a];return this.is_forwarder(a)?this.follow_fs(a).IsDirectory(a.foreign_id):16384===(a.mode&61440)};L.prototype.IsEmpty=function(a){a=this.inodes[a];if(this.is_forwarder(a))return this.follow_fs(a).IsDirectory(a.foreign_id);for(const b of a.direntries.keys())if("."!==b&&".."!==b)return!1;
|
|
288
|
+
return!0};L.prototype.GetChildren=function(a){l(this.IsDirectory(a),"Filesystem: cannot get children of non-directory inode");a=this.inodes[a];if(this.is_forwarder(a))return this.follow_fs(a).GetChildren(a.foreign_id);const b=[];for(const c of a.direntries.keys())"."!==c&&".."!==c&&b.push(c);return b};L.prototype.GetParent=function(a){l(this.IsDirectory(a),"Filesystem: cannot get parent of non-directory inode");a=this.inodes[a];if(this.should_be_linked(a))return a.direntries.get("..");const b=this.follow_fs(a).GetParent(a.foreign_id);
|
|
289
|
+
l(-1!==b,"Filesystem: should not have invalid parent ids");return this.get_forwarder(a.mount_id,b)};L.prototype.PrepareCAPs=function(a){a=this.GetInode(a);if(a.caps)return a.caps.length;a.caps=new Uint8Array(20);a.caps[0]=0;a.caps[1]=0;a.caps[2]=0;a.caps[3]=2;a.caps[4]=255;a.caps[5]=255;a.caps[6]=255;a.caps[7]=255;a.caps[8]=255;a.caps[9]=255;a.caps[10]=255;a.caps[11]=255;a.caps[12]=63;a.caps[13]=0;a.caps[14]=0;a.caps[15]=0;a.caps[16]=63;a.caps[17]=0;a.caps[18]=0;a.caps[19]=0;return a.caps.length};
|
|
290
|
+
function vc(a){this.fs=a;this.backtrack=new Map}vc.prototype.get_state=function(){const a=[];a[0]=this.fs;a[1]=[...this.backtrack];return a};vc.prototype.set_state=function(a){this.fs=a[0];this.backtrack=new Map(a[1])};L.prototype.set_forwarder=function(a,b,c){const d=this.inodes[a];l(0===d.nlinks,"Filesystem: attempted to convert an inode into forwarder before unlinking the inode");this.is_forwarder(d)&&this.mounts[d.mount_id].backtrack.delete(d.foreign_id);d.status=5;d.mount_id=b;d.foreign_id=c;
|
|
291
|
+
this.mounts[b].backtrack.set(c,a)};L.prototype.create_forwarder=function(a,b){const c=this.CreateInode(),d=this.inodes.length;this.inodes.push(c);c.fid=d;this.set_forwarder(d,a,b);return d};L.prototype.is_forwarder=function(a){return 5===a.status};L.prototype.is_a_root=function(a){return 0===this.GetInode(a).fid};L.prototype.get_forwarder=function(a,b){var c=this.mounts[a];l(0<=b,"Filesystem get_forwarder: invalid foreign_id: "+b);l(c,"Filesystem get_forwarder: invalid mount number: "+a);c=c.backtrack.get(b);
|
|
292
|
+
return void 0===c?this.create_forwarder(a,b):c};L.prototype.delete_forwarder=function(a){l(this.is_forwarder(a),"Filesystem delete_forwarder: expected forwarder");a.status=-1;this.mounts[a.mount_id].backtrack.delete(a.foreign_id)};L.prototype.follow_fs=function(a){const b=this.mounts[a.mount_id];l(this.is_forwarder(a),"Filesystem follow_fs: inode should be a forwarding inode");l(b,"Filesystem follow_fs: inode<id="+a.fid+"> should point to valid mounted FS");return b.fs};L.prototype.Mount=function(a,
|
|
293
|
+
b){l(b.qidcounter===this.qidcounter,"Cannot mount filesystem whose qid numbers aren't synchronised with current filesystem.");var c=this.SearchPath(a);if(-1===c.parentid)return B("Mount failed: parent for path not found: "+a,4194304),-2;if(-1!==c.id)return B("Mount failed: file already exists at path: "+a,4194304),-17;if(c.forward_path)return a=this.inodes[c.parentid],c=this.follow_fs(a).Mount(c.forward_path,b),0>c?c:this.get_forwarder(a.mount_id,c);a=this.mounts.length;this.mounts.push(new vc(b));
|
|
294
|
+
b=this.create_forwarder(a,0);this.link_under_dir(c.parentid,b,c.name);return b};function uc(){this.type=2;this.start=0;this.length=Infinity;this.proc_id=-1;this.client_id=""}uc.prototype.get_state=function(){const a=[];a[0]=this.type;a[1]=this.start;a[2]=Infinity===this.length?0:this.length;a[3]=this.proc_id;a[4]=this.client_id;return a};uc.prototype.set_state=function(a){this.type=a[0];this.start=a[1];this.length=0===a[2]?Infinity:a[2];this.proc_id=a[3];this.client_id=a[4]};uc.prototype.clone=function(){const a=
|
|
295
|
+
new uc;a.set_state(this.get_state());return a};uc.prototype.conflicts_with=function(a){return this.proc_id===a.proc_id&&this.client_id===a.client_id||2===this.type||2===a.type||1!==this.type&&1!==a.type||this.start+this.length<=a.start||a.start+a.length<=this.start?!1:!0};uc.prototype.is_alike=function(a){return a.proc_id===this.proc_id&&a.client_id===this.client_id&&a.type===this.type};uc.prototype.may_merge_after=function(a){return this.is_alike(a)&&a.start+a.length===this.start};L.prototype.DescribeLock=
|
|
296
|
+
function(a,b,c,d,e){l(0===a||1===a||2===a,"Filesystem: Invalid lock type: "+a);l(0<=b,"Filesystem: Invalid negative lock starting offset: "+b);l(0<c,"Filesystem: Invalid non-positive lock length: "+c);const f=new uc;f.type=a;f.start=b;f.length=c;f.proc_id=d;f.client_id=e;return f};L.prototype.GetLock=function(a,b){a=this.inodes[a];if(this.is_forwarder(a)){var c=a.foreign_id;return this.follow_fs(a).GetLock(c,b)}for(c of a.locks)if(b.conflicts_with(c))return c.clone();return null};L.prototype.Lock=
|
|
297
|
+
function(a,b,c){const d=this.inodes[a];if(this.is_forwarder(d))return a=d.foreign_id,this.follow_fs(d).Lock(a,b,c);b=b.clone();if(2!==b.type&&this.GetLock(a,b))return 1;for(c=0;c<d.locks.length;c++){a=d.locks[c];l(0<a.length,"Filesystem: Found non-positive lock region length: "+a.length);l(0===a.type||1===a.type,"Filesystem: Found invalid lock type: "+a.type);l(!d.locks[c-1]||d.locks[c-1].start<=a.start,"Filesystem: Locks should be sorted by starting offset");if(a.start+a.length<=b.start)continue;
|
|
298
|
+
if(b.start+b.length<=a.start)break;if(a.proc_id!==b.proc_id||a.client_id!==b.client_id){l(!a.conflicts_with(b),"Filesytem: Found conflicting lock region, despite already checked for conflicts");continue}var e=b.start+b.length;const f=b.start-a.start,g=a.start+a.length-e;if(0<f&&0<g&&a.type===b.type)return 0;0<f&&(a.length=f);if(0>=f&&0<g)a.start=e,a.length=g;else if(0<g){for(;c<d.locks.length&&d.locks[c].start<e;)c++;d.locks.splice(c,0,this.DescribeLock(a.type,e,g,a.proc_id,a.client_id))}else 0>=
|
|
299
|
+
f&&(d.locks.splice(c,1),c--)}if(2!==b.type){c=b;a=!1;for(e=0;e<d.locks.length&&!(c.may_merge_after(d.locks[e])&&(d.locks[e].length+=b.length,c=d.locks[e],a=!0),b.start<=d.locks[e].start);e++);a||(d.locks.splice(e,0,c),e++);for(;e<d.locks.length;e++)if(d.locks[e].is_alike(c)){d.locks[e].may_merge_after(c)&&(c.length+=d.locks[e].length,d.locks.splice(e,1));break}}return 0};L.prototype.read_dir=function(a){a=this.SearchPath(a);if(-1!==a.id)return a=this.GetInode(a.id),Array.from(a.direntries.keys()).filter(b=>
|
|
300
|
+
"."!==b&&".."!==b)};L.prototype.read_file=function(a){a=this.SearchPath(a);if(-1===a.id)return Promise.resolve(null);const b=this.GetInode(a.id);return this.Read(a.id,0,b.size)};function O(a){"number"===typeof a.log_level&&(xa=a.log_level);this.cpu_is_running=!1;this.cpu_exception_hook=function(){};var b=Ia.create();this.bus=b[0];this.emulator_bus=b[1];var c,d;const e=new WebAssembly.Table({element:"anyfunc",initial:1924});b={cpu_exception_hook:g=>this.cpu_exception_hook(g),run_hardware_timers:function(g,
|
|
301
|
+
k){return c.run_hardware_timers(g,k)},cpu_event_halt:()=>{this.emulator_bus.send("cpu-event-halt")},abort:function(){l(!1)},microtick:I.microtick,get_rand_int:function(){return ea()},stop_idling:function(){return c.stop_idling()},io_port_read8:function(g){return c.io.port_read8(g)},io_port_read16:function(g){return c.io.port_read16(g)},io_port_read32:function(g){return c.io.port_read32(g)},io_port_write8:function(g,k){c.io.port_write8(g,k)},io_port_write16:function(g,k){c.io.port_write16(g,k)},io_port_write32:function(g,
|
|
302
|
+
k){c.io.port_write32(g,k)},mmap_read8:function(g){return c.mmap_read8(g)},mmap_read16:function(g){return c.mmap_read16(g)},mmap_read32:function(g){return c.mmap_read32(g)},mmap_write8:function(g,k){c.mmap_write8(g,k)},mmap_write16:function(g,k){c.mmap_write16(g,k)},mmap_write32:function(g,k){c.mmap_write32(g,k)},mmap_write64:function(g,k,m){c.mmap_write64(g,k,m)},mmap_write128:function(g,k,m,p,q){c.mmap_write128(g,k,m,p,q)},log_from_wasm:function(g,k){g=va(d,g,k);B(g,2)},console_log_from_wasm:function(g,
|
|
303
|
+
k){g=va(d,g,k);console.error(g)},dbg_trace_from_wasm:function(){B(Error().stack,2)},codegen_finalize:(g,k,m,p,q)=>{c.codegen_finalize(g,k,m,p,q)},jit_clear_func:g=>c.jit_clear_func(g),jit_clear_all_funcs:()=>c.jit_clear_all_funcs(),__indirect_function_table:e};let f=a.wasm_fn;f||(f=g=>new Promise(k=>{let m="v86-debug.wasm",p="v86-fallback.wasm";a.wasm_path?(m=a.wasm_path,p=m.replace("v86.wasm","v86-fallback.wasm")):"undefined"===typeof window&&"string"===typeof __dirname?(m=__dirname+"/"+m,p=__dirname+
|
|
304
|
+
"/"+p):(m="build/"+m,p="build/"+p);ta(m,{done:async q=>{try{const {instance:r}=await WebAssembly.instantiate(q,g);this.wasm_source=q;k(r.exports)}catch(r){ta(p,{done:async v=>{const {instance:t}=await WebAssembly.instantiate(v,g);this.wasm_source=v;k(t.exports)}})}},progress:q=>{this.emulator_bus.send("download-progress",{file_index:0,file_count:1,file_name:m,lengthComputable:q.lengthComputable,total:q.total,loaded:q.loaded})}})}));f({env:b}).then(g=>{d=g.memory;g.rust_init();g=this.v86=new I(this.emulator_bus,
|
|
305
|
+
{exports:g,wasm_table:e});c=g.cpu;this.continue_init(g,a)});this.zstd_worker=null;this.zstd_worker_request_id=0}O.prototype.continue_init=async function(a,b){function c(v,t){switch(v){case "hda":e.hda=this.disk_images.hda=t;break;case "hdb":e.hdb=this.disk_images.hdb=t;break;case "cdrom":e.cdrom=this.disk_images.cdrom=t;break;case "fda":e.fda=this.disk_images.fda=t;break;case "fdb":e.fdb=this.disk_images.fdb=t;break;case "multiboot":e.multiboot=this.disk_images.multiboot=t.buffer;break;case "bzimage":e.bzimage=
|
|
306
|
+
this.disk_images.bzimage=t.buffer;break;case "initrd":e.initrd=this.disk_images.initrd=t.buffer;break;case "bios":e.bios=t.buffer;break;case "vga_bios":e.vga_bios=t.buffer;break;case "initial_state":e.initial_state=t.buffer;break;case "fs9p_json":e.fs9p_json=t;break;default:l(!1,v)}}async function d(){if(e.fs9p&&e.fs9p_json)if(e.initial_state)B("Filesystem basefs ignored: Overridden by state image");else{if(e.fs9p.load_from_json(e.fs9p_json),b.bzimage_initrd_from_filesystem){const {bzimage_path:v,
|
|
307
|
+
initrd_path:t}=this.get_bzimage_initrd_from_filesystem(e.fs9p);B("Found bzimage: "+v+" and initrd: "+t);const [z,A]=await Promise.all([e.fs9p.read_file(t),e.fs9p.read_file(v)]);c.call(this,"initrd",new za(z.buffer));c.call(this,"bzimage",new za(A.buffer))}}else l(!b.bzimage_initrd_from_filesystem||e.initial_state,"bzimage_initrd_from_filesystem: Requires a filesystem");this.serial_adapter&&this.serial_adapter.show&&this.serial_adapter.show();this.v86.init(e);e.initial_state&&(a.restore_state(e.initial_state),
|
|
308
|
+
e.initial_state=void 0);b.autostart&&this.v86.run();this.emulator_bus.send("emulator-loaded")}this.bus.register("emulator-stopped",function(){this.cpu_is_running=!1;this.screen_adapter.pause()},this);this.bus.register("emulator-started",function(){this.cpu_is_running=!0;this.screen_adapter.continue()},this);var e={};this.disk_images={fda:void 0,fdb:void 0,hda:void 0,hdb:void 0,cdrom:void 0};var f=b.boot_order?b.boot_order:b.fda?801:b.hda?786:291;e.acpi=b.acpi;e.disable_jit=b.disable_jit;e.load_devices=
|
|
309
|
+
!0;e.memory_size=b.memory_size||67108864;e.vga_memory_size=b.vga_memory_size||8388608;e.boot_order=f;e.fastboot=b.fastboot||!1;e.fda=void 0;e.fdb=void 0;e.uart1=b.uart1;e.uart2=b.uart2;e.uart3=b.uart3;e.cmdline=b.cmdline;e.preserve_mac_from_state_image=b.preserve_mac_from_state_image;e.mac_address_translation=b.mac_address_translation;e.cpuid_level=b.cpuid_level;e.virtio_balloon=b.virtio_balloon;e.virtio_console=b.virtio_console;e.screen_options=b.screen_options;if(f=b.network_relay_url||b.net_device&&
|
|
310
|
+
b.net_device.relay_url)"fetch"===f?this.network_adapter=new Zb(this.bus,b.net_device):"inbrowser"===f?this.network_adapter=new nc(this.bus,b.net_device):f.startsWith("wisp://")||f.startsWith("wisps://")?this.network_adapter=new ac(f,this.bus,b.net_device):this.network_adapter=new wb(f,this.bus);e.net_device=b.net_device||{type:"ne2k"};f=b.screen||{};b.screen_container&&(f.container=b.screen_container);b.disable_keyboard||(this.keyboard_adapter=new cc(this.bus));b.disable_mouse||(this.mouse_adapter=
|
|
311
|
+
new dc(this.bus,f.container));this.screen_adapter=f.container?new ya(f,()=>this.v86.cpu.devices.vga&&this.v86.cpu.devices.vga.screen_fill_buffer()):new ec;e.screen=this.screen_adapter;e.screen_options=f;b.serial_container&&(this.serial_adapter=new lc(b.serial_container,this.bus));b.serial_container_xtermjs&&(this.serial_adapter=new mc(b.serial_container_xtermjs,this.bus));b.disable_speaker||(this.speaker_adapter=new lb(this.bus));var g=[];f=(v,t)=>{if(t)if(t.get&&t.set&&t.load)g.push({name:v,loadable:t});
|
|
312
|
+
else{if("bios"===v||"vga_bios"===v||"initial_state"===v||"multiboot"===v||"bzimage"===v||"initrd"===v)t.async=!1;if("fda"===v||"fdb"===v)t.async=!1;t.url&&!t.async?g.push({name:v,url:t.url,size:t.size}):g.push({name:v,loadable:Ea(t,this.zstd_decompress_worker.bind(this))})}};b.state&&console.warn("Warning: Unknown option 'state'. Did you mean 'initial_state'?");f("bios",b.bios);f("vga_bios",b.vga_bios);f("cdrom",b.cdrom);f("hda",b.hda);f("hdb",b.hdb);f("fda",b.fda);f("fdb",b.fdb);f("initial_state",
|
|
313
|
+
b.initial_state);f("multiboot",b.multiboot);f("bzimage",b.bzimage);f("initrd",b.initrd);if(b.filesystem&&b.filesystem.handle9p)e.handle9p=b.filesystem.handle9p;else if(b.filesystem&&b.filesystem.proxy_url)e.proxy9p=b.filesystem.proxy_url;else if(b.filesystem){f=b.filesystem.basefs;var k=b.filesystem.baseurl;let v=new oc;k&&(v=new pc(v,k));e.fs9p=this.fs9p=new L(v);if(f){l(k,"Filesystem: baseurl must be specified");if("object"===typeof f){var m=f.size;f=f.url}l("string"===typeof f);g.push({name:"fs9p_json",
|
|
314
|
+
url:f,size:m,as_json:!0})}}var p=this,q=g.length,r=function(v){if(v===q)setTimeout(d.bind(this),0);else{var t=g[v];t.loadable?(t.loadable.onload=function(){c.call(this,t.name,t.loadable);r(v+1)}.bind(this),t.loadable.load()):ta(t.url,{done:function(z){t.url.endsWith(".zst")&&"initial_state"!==t.name&&(l(t.size,"A size must be provided for compressed images"),z=this.zstd_decompress(t.size,new Uint8Array(z)));c.call(this,t.name,t.as_json?z:new za(z));r(v+1)}.bind(this),progress:function(z){200===z.target.status?
|
|
315
|
+
p.emulator_bus.send("download-progress",{file_index:v,file_count:q,file_name:t.url,lengthComputable:z.lengthComputable,total:z.total||t.size,loaded:z.loaded}):p.emulator_bus.send("download-error",{file_index:v,file_count:q,file_name:t.url,request:z.target})},as_json:t.as_json})}}.bind(this);r(0)};O.prototype.zstd_decompress=function(a,b){const c=this.v86.cpu;l(!this.zstd_context);this.zstd_context=c.zstd_create_ctx(b.length);(new Uint8Array(c.wasm_memory.buffer)).set(b,c.zstd_get_src_ptr(this.zstd_context));
|
|
316
|
+
b=c.zstd_read(this.zstd_context,a);const d=c.wasm_memory.buffer.slice(b,b+a);c.zstd_read_free(b,a);c.zstd_free_ctx(this.zstd_context);this.zstd_context=null;return d};O.prototype.zstd_decompress_worker=async function(a,b){if(!this.zstd_worker){const c=URL.createObjectURL(new Blob(["("+function(){let d;globalThis.onmessage=function(e){if(d){var {src:f,decompressed_size:g,id:k}=e.data;e=d.exports;var m=e.zstd_create_ctx(f.length);(new Uint8Array(e.memory.buffer)).set(f,e.zstd_get_src_ptr(m));var p=
|
|
317
|
+
e.zstd_read(m,g),q=e.memory.buffer.slice(p,p+g);e.zstd_read_free(p,g);e.zstd_free_ctx(m);postMessage({result:q,id:k},[q])}else m=Object.fromEntries("cpu_exception_hook run_hardware_timers cpu_event_halt microtick get_rand_int stop_idling io_port_read8 io_port_read16 io_port_read32 io_port_write8 io_port_write16 io_port_write32 mmap_read8 mmap_read16 mmap_read32 mmap_write8 mmap_write16 mmap_write32 mmap_write64 mmap_write128 codegen_finalize jit_clear_func jit_clear_all_funcs".split(" ").map(r=>[r,
|
|
318
|
+
()=>console.error("zstd worker unexpectedly called "+r)])),m.__indirect_function_table=new WebAssembly.Table({element:"anyfunc",initial:1024}),m.abort=()=>{throw Error("zstd worker aborted");},m.log_from_wasm=m.console_log_from_wasm=(r,v)=>{console.log(va(d.exports.memory.buffer,r,v))},m.dbg_trace_from_wasm=()=>console.trace(),d=new WebAssembly.Instance(new WebAssembly.Module(e.data),{env:m})}}.toString()+")()"],{type:"text/javascript"}));this.zstd_worker=new Worker(c);URL.revokeObjectURL(c);this.zstd_worker.postMessage(this.wasm_source,
|
|
319
|
+
[this.wasm_source])}return new Promise(c=>{const d=this.zstd_worker_request_id++,e=async f=>{f.data.id===d&&(this.zstd_worker.removeEventListener("message",e),l(a===f.data.result.byteLength),c(f.data.result))};this.zstd_worker.addEventListener("message",e);this.zstd_worker.postMessage({src:b,decompressed_size:a,id:d},[b.buffer])})};O.prototype.get_bzimage_initrd_from_filesystem=function(a){const b=(a.read_dir("/")||[]).map(e=>"/"+e);a=(a.read_dir("/boot/")||[]).map(e=>"/boot/"+e);let c,d;for(const e of[].concat(b,
|
|
320
|
+
a)){const f=/old/i.test(e)||/fallback/i.test(e),g=/vmlinuz/i.test(e)||/bzimage/i.test(e),k=/initrd/i.test(e)||/initramfs/i.test(e);!g||d&&f||(d=e);!k||c&&f||(c=e)}c&&d||(console.log("Failed to find bzimage or initrd in filesystem. Files:"),console.log(b.join(" ")),console.log(a.join(" ")));return{initrd_path:c,bzimage_path:d}};O.prototype.run=async function(){this.v86.run()};O.prototype.stop=async function(){this.cpu_is_running&&await new Promise(a=>{const b=()=>{this.remove_listener("emulator-stopped",
|
|
321
|
+
b);a()};this.add_listener("emulator-stopped",b);this.v86.stop()})};O.prototype.destroy=async function(){await this.stop();this.v86.destroy();this.keyboard_adapter&&this.keyboard_adapter.destroy();this.network_adapter&&this.network_adapter.destroy();this.mouse_adapter&&this.mouse_adapter.destroy();this.screen_adapter&&this.screen_adapter.destroy();this.serial_adapter&&this.serial_adapter.destroy();this.speaker_adapter&&this.speaker_adapter.destroy()};O.prototype.restart=function(){this.v86.restart()};
|
|
322
|
+
O.prototype.add_listener=function(a,b){this.bus.register(a,b,this)};O.prototype.remove_listener=function(a,b){this.bus.unregister(a,b)};O.prototype.restore_state=async function(a){l(1===arguments.length);this.v86.restore_state(a)};O.prototype.save_state=async function(){l(0===arguments.length);return this.v86.save_state()};O.prototype.get_instruction_counter=function(){return this.v86?this.v86.cpu.instruction_counter[0]>>>0:0};O.prototype.is_running=function(){return this.cpu_is_running};O.prototype.set_fda=
|
|
323
|
+
async function(a){const b=this.v86.cpu.devices.fdc.drives[0];if(a.url&&!a.async)await new Promise(c=>{ta(a.url,{done:d=>{b.insert_disk(new za(d));c()}})});else{const c=Ea(a,this.zstd_decompress_worker.bind(this));c.onload=()=>{b.insert_disk(c)};await c.load()}};O.prototype.set_fdb=async function(a){const b=this.v86.cpu.devices.fdc.drives[1];if(a.url&&!a.async)await new Promise(c=>{ta(a.url,{done:d=>{b.insert_disk(new za(d));c()}})});else{const c=Ea(a,this.zstd_decompress_worker.bind(this));c.onload=
|
|
324
|
+
()=>{b.insert_disk(c)};await c.load()}};O.prototype.eject_fda=function(){this.v86.cpu.devices.fdc.drives[0].eject_disk()};O.prototype.eject_fdb=function(){this.v86.cpu.devices.fdc.drives[1].eject_disk()};O.prototype.get_disk_fda=function(){return this.v86.cpu.devices.fdc.drives[0].get_buffer()};O.prototype.get_disk_fdb=function(){return this.v86.cpu.devices.fdc.drives[1].get_buffer()};O.prototype.set_cdrom=async function(a){if(a.url&&!a.async)ta(a.url,{done:b=>{this.v86.cpu.devices.cdrom.set_cdrom(new za(b))}});
|
|
325
|
+
else{const b=Ea(a,this.zstd_decompress_worker.bind(this));b.onload=()=>{this.v86.cpu.devices.cdrom.set_cdrom(b)};await b.load()}};O.prototype.eject_cdrom=function(){this.v86.cpu.devices.cdrom.eject()};O.prototype.keyboard_send_scancodes=async function(a,b){for(var c=0;c<a.length;c++)this.bus.send("keyboard-code",a[c]),b&&await new Promise(d=>setTimeout(d,b))};O.prototype.keyboard_send_keys=async function(a,b){for(var c=0;c<a.length;c++)this.keyboard_adapter.simulate_press(a[c]),b&&await new Promise(d=>
|
|
326
|
+
setTimeout(d,b))};O.prototype.keyboard_send_text=async function(a,b){for(var c=0;c<a.length;c++)this.keyboard_adapter.simulate_char(a[c]),b&&await new Promise(d=>setTimeout(d,b))};O.prototype.screen_make_screenshot=function(){return this.screen_adapter?this.screen_adapter.make_screenshot():null};O.prototype.screen_set_scale=function(a,b){this.screen_adapter&&this.screen_adapter.set_scale(a,b)};O.prototype.screen_go_fullscreen=function(){if(this.screen_adapter){var a=document.getElementById("screen_container");
|
|
327
|
+
if(a){var b=a.requestFullScreen||a.webkitRequestFullscreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&(b.call(a),(a=document.getElementsByClassName("phone_keyboard")[0])&&a.focus());try{navigator.keyboard.lock()}catch(c){}this.lock_mouse()}}};O.prototype.lock_mouse=async function(){const a=document.body;try{await a.requestPointerLock({unadjustedMovement:!0})}catch(b){await a.requestPointerLock()}};O.prototype.mouse_set_enabled=function(a){this.mouse_adapter&&(this.mouse_adapter.emu_enabled=
|
|
328
|
+
a)};O.prototype.mouse_set_status=O.prototype.mouse_set_enabled;O.prototype.keyboard_set_enabled=function(a){this.keyboard_adapter&&(this.keyboard_adapter.emu_enabled=a)};O.prototype.keyboard_set_status=O.prototype.keyboard_set_enabled;O.prototype.serial0_send=function(a){for(var b=0;b<a.length;b++)this.bus.send("serial0-input",a.charCodeAt(b))};O.prototype.serial_send_bytes=function(a,b){for(var c=0;c<b.length;c++)this.bus.send("serial"+a+"-input",b[c])};O.prototype.serial_set_modem_status=function(a,
|
|
329
|
+
b){this.bus.send("serial"+a+"-modem-status-input",b)};O.prototype.serial_set_carrier_detect=function(a,b){this.bus.send("serial"+a+"-carrier-detect-input",b)};O.prototype.serial_set_ring_indicator=function(a,b){this.bus.send("serial"+a+"-ring-indicator-input",b)};O.prototype.serial_set_data_set_ready=function(a,b){this.bus.send("serial"+a+"-data-set-ready-input",b)};O.prototype.serial_set_clear_to_send=function(a,b){this.bus.send("serial"+a+"-clear-to-send-input",b)};O.prototype.create_file=async function(a,
|
|
330
|
+
b){l(2===arguments.length);var c=this.fs9p;if(c){var d=a.split("/");d=d[d.length-1];var e=c.SearchPath(a).parentid;if(""!==d&&-1!==e)await c.CreateBinaryFile(d,e,b);else return Promise.reject(new wc)}};O.prototype.read_file=async function(a){l(1===arguments.length);var b=this.fs9p;if(b)return(b=await b.read_file(a))?b:Promise.reject(new wc)};O.prototype.automatically=function(a){const b=c=>{const d=c[0];if(d){var e=c.slice(1);d.sleep?setTimeout(()=>b(e),1E3*d.sleep):d.vga_text?this.wait_until_vga_screen_contains(d.vga_text).then(()=>
|
|
331
|
+
b(e)):d.keyboard_send?(Array.isArray(d.keyboard_send)?this.keyboard_send_scancodes(d.keyboard_send):(l("string"===typeof d.keyboard_send),this.keyboard_send_text(d.keyboard_send)),b(e)):d.call?(d.call(),b(e)):l(!1,d)}};b(a)};O.prototype.wait_until_vga_screen_contains=async function(a,b){const c=Array.isArray(a);var d=b?.timeout_msec||0;const e=new Set;b=p=>e.add(p[0]);const f=(p,q)=>q.test?q.test(p):p.startsWith(q),g=[];this.add_listener("screen-put-char",b);for(var k of this.screen_adapter.get_text_screen())if(c)g.push(k.trimRight());
|
|
332
|
+
else if(f(k,a))return this.remove_listener("screen-put-char",b),!0;k=!1;d=d?performance.now()+d:0;a:for(;!d||performance.now()<d;){if(c){for(var m=g.length;0<m&&""===g[m-1];)m--;m-=a.length;if(0<=m){let p=!0;for(let q=0;q<a.length&&p;q++)p=f(g[m+q],a[q]);if(p){k=!0;break}}}await new Promise(p=>setTimeout(p,100));for(const p of e)if(m=this.screen_adapter.get_text_row(p),c)g[p]=m.trimRight();else if(f(m,a)){k=!0;break a}e.clear()}this.remove_listener("screen-put-char",b);return k};O.prototype.read_memory=
|
|
333
|
+
function(a,b){return this.v86.cpu.read_blob(a,b)};O.prototype.write_memory=function(a,b){this.v86.cpu.write_blob(a,b)};O.prototype.set_serial_container_xtermjs=function(a){this.serial_adapter&&this.serial_adapter.destroy&&this.serial_adapter.destroy();this.serial_adapter=new mc(a,this.bus);this.serial_adapter.show()};O.prototype.get_instruction_stats=function(){var a=this.v86.cpu;var b="";var c="COMPILE COMPILE_SKIPPED_NO_NEW_ENTRY_POINTS COMPILE_WRONG_ADDRESS_SPACE COMPILE_CUT_OFF_AT_END_OF_PAGE COMPILE_WITH_LOOP_SAFETY COMPILE_PAGE COMPILE_PAGE/COMPILE COMPILE_BASIC_BLOCK COMPILE_DUPLICATED_BASIC_BLOCK COMPILE_WASM_BLOCK COMPILE_WASM_LOOP COMPILE_DISPATCHER COMPILE_ENTRY_POINT COMPILE_WASM_TOTAL_BYTES COMPILE_WASM_TOTAL_BYTES/COMPILE_PAGE RUN_INTERPRETED RUN_INTERPRETED_NEW_PAGE RUN_INTERPRETED_PAGE_HAS_CODE RUN_INTERPRETED_PAGE_HAS_ENTRY_AFTER_PAGE_WALK RUN_INTERPRETED_NEAR_END_OF_PAGE RUN_INTERPRETED_DIFFERENT_STATE RUN_INTERPRETED_DIFFERENT_STATE_CPL3 RUN_INTERPRETED_DIFFERENT_STATE_FLAT RUN_INTERPRETED_DIFFERENT_STATE_IS32 RUN_INTERPRETED_DIFFERENT_STATE_SS32 RUN_INTERPRETED_MISSED_COMPILED_ENTRY_RUN_INTERPRETED RUN_INTERPRETED_STEPS RUN_FROM_CACHE RUN_FROM_CACHE_STEPS RUN_FROM_CACHE_STEPS/RUN_FROM_CACHE RUN_FROM_CACHE_STEPS/RUN_INTERPRETED_STEPS DIRECT_EXIT INDIRECT_JUMP INDIRECT_JUMP_NO_ENTRY NORMAL_PAGE_CHANGE NORMAL_FALLTHRU NORMAL_FALLTHRU_WITH_TARGET_BLOCK NORMAL_BRANCH NORMAL_BRANCH_WITH_TARGET_BLOCK CONDITIONAL_JUMP CONDITIONAL_JUMP_PAGE_CHANGE CONDITIONAL_JUMP_EXIT CONDITIONAL_JUMP_FALLTHRU CONDITIONAL_JUMP_FALLTHRU_WITH_TARGET_BLOCK CONDITIONAL_JUMP_BRANCH CONDITIONAL_JUMP_BRANCH_WITH_TARGET_BLOCK DISPATCHER_SMALL DISPATCHER_LARGE LOOP LOOP_SAFETY CONDITION_OPTIMISED CONDITION_UNOPTIMISED CONDITION_UNOPTIMISED_PF CONDITION_UNOPTIMISED_UNHANDLED_L CONDITION_UNOPTIMISED_UNHANDLED_LE FAILED_PAGE_CHANGE SAFE_READ_FAST SAFE_READ_SLOW_PAGE_CROSSED SAFE_READ_SLOW_NOT_VALID SAFE_READ_SLOW_NOT_USER SAFE_READ_SLOW_IN_MAPPED_RANGE SAFE_WRITE_FAST SAFE_WRITE_SLOW_PAGE_CROSSED SAFE_WRITE_SLOW_NOT_VALID SAFE_WRITE_SLOW_NOT_USER SAFE_WRITE_SLOW_IN_MAPPED_RANGE SAFE_WRITE_SLOW_READ_ONLY SAFE_WRITE_SLOW_HAS_CODE SAFE_READ_WRITE_FAST SAFE_READ_WRITE_SLOW_PAGE_CROSSED SAFE_READ_WRITE_SLOW_NOT_VALID SAFE_READ_WRITE_SLOW_NOT_USER SAFE_READ_WRITE_SLOW_IN_MAPPED_RANGE SAFE_READ_WRITE_SLOW_READ_ONLY SAFE_READ_WRITE_SLOW_HAS_CODE PAGE_FAULT TLB_MISS MAIN_LOOP MAIN_LOOP_IDLE DO_MANY_CYCLES CYCLE_INTERNAL INVALIDATE_ALL_MODULES_NO_FREE_WASM_INDICES INVALIDATE_MODULE_WRITTEN_WHILE_COMPILED INVALIDATE_MODULE_UNUSED_AFTER_OVERWRITE INVALIDATE_MODULE_DIRTY_PAGE INVALIDATE_PAGE_HAD_CODE INVALIDATE_PAGE_HAD_ENTRY_POINTS DIRTY_PAGE_DID_NOT_HAVE_CODE RUN_FROM_CACHE_EXIT_SAME_PAGE RUN_FROM_CACHE_EXIT_NEAR_END_OF_PAGE RUN_FROM_CACHE_EXIT_DIFFERENT_PAGE CLEAR_TLB FULL_CLEAR_TLB TLB_FULL TLB_GLOBAL_FULL MODRM_SIMPLE_REG MODRM_SIMPLE_REG_WITH_OFFSET MODRM_SIMPLE_CONST_OFFSET MODRM_COMPLEX SEG_OFFSET_OPTIMISED SEG_OFFSET_NOT_OPTIMISED SEG_OFFSET_NOT_OPTIMISED_ES SEG_OFFSET_NOT_OPTIMISED_FS SEG_OFFSET_NOT_OPTIMISED_GS SEG_OFFSET_NOT_OPTIMISED_NOT_FLAT".split(" "),
|
|
334
|
+
d=0;const e={};for(let g=0;g<c.length;g++){const k=c[g];var f=void 0;if(k.includes("/")){d++;const [m,p]=k.split("/");f=e[m]/e[p]}else f=e[k]=a.wm.exports.profiler_stat_get(g-d),f=1E8<=f?Math.round(f/1E6)+"m":1E5<=f?Math.round(f/1E3)+"k":f;b+=k+"="+f+"\n"}b+="\n";c=a.wm.exports.get_valid_tlb_entries_count();d=a.wm.exports.get_valid_global_tlb_entries_count();b=b+("TLB_ENTRIES="+c+" ("+d+" global, "+(c-d)+" non-global)\nWASM_TABLE_FREE=")+(a.wm.exports.jit_get_wasm_table_index_free_list_count()+"\n");
|
|
335
|
+
b+="JIT_CACHE_SIZE="+a.wm.exports.jit_get_cache_size()+"\n";b+="FLAT_SEGMENTS="+a.wm.exports.has_flat_segmentation()+"\n";b+="wasm memory size: "+(a.wasm_memory.buffer.byteLength>>20)+"m\n";b=b+"Config:\nJIT_DISABLED="+(a.wm.exports.get_jit_config(0)+"\n");b+="MAX_PAGES="+a.wm.exports.get_jit_config(1)+"\n";b+="JIT_USE_LOOP_SAFETY="+!!a.wm.exports.get_jit_config(2)+"\n";b+="MAX_EXTRA_BASIC_BLOCKS="+a.wm.exports.get_jit_config(3)+"\n";a=[hb(a,!1,!1,!1,!1),hb(a,!0,!1,!1,!1),hb(a,!1,!0,!1,!1),hb(a,!1,
|
|
336
|
+
!1,!0,!1),hb(a,!1,!1,!1,!0)].join("\n\n");return b+a};function wc(a){this.message=a||"File not found"}wc.prototype=Error.prototype;"undefined"!==typeof module&&"undefined"!==typeof module.exports?module.exports.V86=O:"undefined"!==typeof window?window.V86=O:"function"===typeof importScripts&&(self.V86=O);function I(a,b){this.stopping=this.running=!1;this.idle=!0;this.tick_counter=0;this.worker=null;this.cpu=new P(a,b,()=>{this.idle&&this.next_tick(0)});this.bus=a;this.register_yield()}I.prototype.run=
|
|
337
|
+
function(){this.stopping=!1;this.running||(this.running=!0,this.bus.send("emulator-started"));this.next_tick(0)};I.prototype.do_tick=function(){if(this.stopping||!this.running)this.stopping=this.running=!1,this.bus.send("emulator-stopped");else{this.idle=!1;var a=this.cpu.main_loop();this.next_tick(a)}};I.prototype.next_tick=function(a){const b=++this.tick_counter;this.idle=!0;this.yield(a,b)};I.prototype.yield_callback=function(a){a===this.tick_counter&&this.do_tick()};I.prototype.stop=function(){this.running&&
|
|
338
|
+
(this.stopping=!0)};I.prototype.destroy=function(){this.unregister_yield()};I.prototype.restart=function(){this.cpu.reset_cpu();this.cpu.load_bios()};I.prototype.init=function(a){this.cpu.init(a,this.bus);this.bus.send("emulator-ready")};if("undefined"!==typeof process)I.prototype.yield=function(a,b){1>a?global.setImmediate(c=>this.yield_callback(c),b):setTimeout(c=>this.yield_callback(c),a,b)},I.prototype.register_yield=function(){},I.prototype.unregister_yield=function(){};else if("undefined"!==
|
|
339
|
+
typeof Worker){function a(){let b;globalThis.onmessage=function(c){const d=c.data.t;b=b&&clearTimeout(b);1>d?postMessage(c.data.tick):b=setTimeout(()=>postMessage(c.data.tick),d)}}I.prototype.register_yield=function(){const b=URL.createObjectURL(new Blob(["("+a.toString()+")()"],{type:"text/javascript"}));this.worker=new Worker(b);this.worker.onmessage=c=>this.yield_callback(c.data);URL.revokeObjectURL(b)};I.prototype.yield=function(b,c){this.worker.postMessage({t:b,tick:c})};I.prototype.unregister_yield=
|
|
340
|
+
function(){this.worker&&this.worker.terminate();this.worker=null}}else I.prototype.yield=function(a){setTimeout(()=>{this.do_tick()},a)},I.prototype.register_yield=function(){},I.prototype.unregister_yield=function(){};I.prototype.save_state=function(){for(var a=[],b=eb(this.cpu,a),c=[],d=0,e=0;e<a.length;e++){var f=a[e].byteLength;c[e]={offset:d,length:f};d+=f;d=d+3&-4}b=JSON.stringify({buffer_infos:c,state:b});b=(new TextEncoder).encode(b);e=16+b.length;e=e+3&-4;var g=e+d;d=new ArrayBuffer(g);var k=
|
|
341
|
+
new Int32Array(d,0,4);(new Uint8Array(d,16,b.length)).set(b);f=new Uint8Array(d,e);k[0]=-2039052682;k[1]=6;k[2]=g;k[3]=b.length;for(e=0;e<a.length;e++)g=a[e],l(g.constructor===Uint8Array),f.set(g,c[e].offset);B("State: json size "+(b.byteLength>>10)+"k");B("State: Total buffers size "+(f.byteLength>>10)+"k");return d};I.prototype.restore_state=function(a){return gb(this.cpu,a)};if("object"===typeof performance&&performance.now)I.microtick=performance.now.bind(performance);else if("function"===typeof require){const {performance:a}=
|
|
342
|
+
require("perf_hooks");I.microtick=a.now.bind(a)}else I.microtick="object"===typeof process&&process.hrtime?function(){var a=process.hrtime();return 1E3*a[0]+a[1]/1E6}:Date.now;function xc(a){this.cpu=a;var b=a.io;a.devices.pci.register_device({pci_id:56,pci_space:[134,128,19,113,7,0,128,2,8,0,128,6,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,1,0,0],pci_bars:[],name:"acpi"});this.timer_imprecision_offset=this.timer_last_value=0;this.status=1;
|
|
343
|
+
this.pm1_enable=this.pm1_status=0;this.last_timer=this.get_timer(I.microtick());this.gpe=new Uint8Array(4);b.register_read(45056,this,void 0,function(){B("ACPI pm1_status read",262144);return this.pm1_status});b.register_write(45056,this,void 0,function(c){B("ACPI pm1_status write: "+n(c,4),262144);this.pm1_status&=~c});b.register_read(45058,this,void 0,function(){B("ACPI pm1_enable read",262144);return this.pm1_enable});b.register_write(45058,this,void 0,function(c){B("ACPI pm1_enable write: "+n(c),
|
|
344
|
+
262144);this.pm1_enable=c});b.register_read(45060,this,function(){B("ACPI status read8",262144);return this.status&255},function(){B("ACPI status read",262144);return this.status});b.register_write(45060,this,void 0,function(c){B("ACPI status write: "+n(c),262144);this.status=c});b.register_read(45064,this,void 0,void 0,function(){return this.get_timer(I.microtick())&16777215});b.register_read(45024,this,function(){B("Read gpe#0",262144);return this.gpe[0]});b.register_read(45025,this,function(){B("Read gpe#1",
|
|
345
|
+
262144);return this.gpe[1]});b.register_read(45026,this,function(){B("Read gpe#2",262144);return this.gpe[2]});b.register_read(45027,this,function(){B("Read gpe#3",262144);return this.gpe[3]});b.register_write(45024,this,function(c){B("Write gpe#0: "+n(c),262144);this.gpe[0]=c});b.register_write(45025,this,function(c){B("Write gpe#1: "+n(c),262144);this.gpe[1]=c});b.register_write(45026,this,function(c){B("Write gpe#2: "+n(c),262144);this.gpe[2]=c});b.register_write(45027,this,function(c){B("Write gpe#3: "+
|
|
346
|
+
n(c),262144);this.gpe[3]=c})}xc.prototype.timer=function(a){a=this.get_timer(a);var b=0!==((a^this.last_timer)&8388608);this.pm1_enable&1&&b?(B("ACPI raise irq",262144),this.pm1_status|=1,this.cpu.device_raise_irq(9)):this.cpu.device_lower_irq(9);this.last_timer=a;return 100};xc.prototype.get_timer=function(a){a=Math.round(3579.545*a);a===this.timer_last_value?3579.545>this.timer_imprecision_offset&&this.timer_imprecision_offset++:(l(a>this.timer_last_value),this.timer_last_value+this.timer_imprecision_offset<=
|
|
347
|
+
a?(this.timer_imprecision_offset=0,this.timer_last_value=a):B("Warning: Overshot pmtimer, waiting; current="+a+" last="+this.timer_last_value+" offset="+this.timer_imprecision_offset,262144));return this.timer_last_value+this.timer_imprecision_offset};xc.prototype.get_state=function(){var a=[];a[0]=this.status;a[1]=this.pm1_status;a[2]=this.pm1_enable;a[3]=this.gpe;return a};xc.prototype.set_state=function(a){this.status=a[0];this.pm1_status=a[1];this.pm1_enable=a[2];this.gpe=a[3]};function yc(a,
|
|
348
|
+
b,c){this.bus=c;this.cpu=a;this.ints=4;this.line_control=this.baud_rate=0;this.lsr=96;this.ier=this.fifo_control=0;this.iir=1;this.irq=this.scratch_register=this.modem_status=this.modem_control=0;this.input=[];this.current_line="";switch(b){case 1016:this.com=0;this.irq=4;break;case 760:this.com=1;this.irq=3;break;case 1E3:this.com=2;this.irq=4;break;case 744:this.irq=this.com=3;break;default:B("Invalid serial port: "+n(b),16384),this.com=0,this.irq=4}this.bus.register("serial"+this.com+"-input",
|
|
349
|
+
function(d){this.data_received(d)},this);this.bus.register("serial"+this.com+"-modem-status-input",function(d){this.set_modem_status(d)},this);this.bus.register("serial"+this.com+"-carrier-detect-input",function(d){this.set_modem_status(d?this.modem_status|136:this.modem_status&-137)},this);this.bus.register("serial"+this.com+"-ring-indicator-input",function(d){this.set_modem_status(d?this.modem_status|68:this.modem_status&-69)},this);this.bus.register("serial"+this.com+"-data-set-ready-input",function(d){this.set_modem_status(d?
|
|
350
|
+
this.modem_status|34:this.modem_status&-35)},this);this.bus.register("serial"+this.com+"-clear-to-send-input",function(d){this.set_modem_status(d?this.modem_status|17:this.modem_status&-18)},this);a=a.io;a.register_write(b,this,function(d){this.write_data(d)},function(d){this.write_data(d&255);this.write_data(d>>8)});a.register_write(b|1,this,function(d){this.line_control&128?(this.baud_rate=this.baud_rate&255|d<<8,B("baud rate: "+n(this.baud_rate),16384)):(0===(this.ier&2)&&d&2&&this.ThrowInterrupt(2),
|
|
351
|
+
this.ier=d&15,B("interrupt enable: "+n(d),16384),this.CheckInterrupt())});a.register_read(b,this,function(){if(this.line_control&128)return this.baud_rate&255;let d=0;0===this.input.length?B("Read input empty",16384):(d=this.input.shift(),B("Read input: "+n(d),16384));0===this.input.length&&(this.lsr&=-2,this.ClearInterrupt(12),this.ClearInterrupt(4));return d});a.register_read(b|1,this,function(){return this.line_control&128?this.baud_rate>>8:this.ier&15});a.register_read(b|2,this,function(){var d=
|
|
352
|
+
this.iir&15;B("read interrupt identification: "+n(this.iir),16384);2===this.iir&&this.ClearInterrupt(2);this.fifo_control&1&&(d|=192);return d});a.register_write(b|2,this,function(d){B("fifo control: "+n(d),16384);this.fifo_control=d});a.register_read(b|3,this,function(){B("read line control: "+n(this.line_control),16384);return this.line_control});a.register_write(b|3,this,function(d){B("line control: "+n(d),16384);this.line_control=d});a.register_read(b|4,this,function(){return this.modem_control});
|
|
353
|
+
a.register_write(b|4,this,function(d){B("modem control: "+n(d),16384);this.modem_control=d});a.register_read(b|5,this,function(){B("read line status: "+n(this.lsr),16384);return this.lsr});a.register_write(b|5,this,function(){B("Factory test write",16384)});a.register_read(b|6,this,function(){B("read modem status: "+n(this.modem_status),16384);return this.modem_status&=240});a.register_write(b|6,this,function(d){B("write modem status: "+n(d),16384);this.set_modem_status(d)});a.register_read(b|7,this,
|
|
354
|
+
function(){return this.scratch_register});a.register_write(b|7,this,function(d){this.scratch_register=d})}yc.prototype.get_state=function(){var a=[];a[0]=this.ints;a[1]=this.baud_rate;a[2]=this.line_control;a[3]=this.lsr;a[4]=this.fifo_control;a[5]=this.ier;a[6]=this.iir;a[7]=this.modem_control;a[8]=this.modem_status;a[9]=this.scratch_register;a[10]=this.irq;return a};yc.prototype.set_state=function(a){this.ints=a[0];this.baud_rate=a[1];this.line_control=a[2];this.lsr=a[3];this.fifo_control=a[4];
|
|
355
|
+
this.ier=a[5];this.iir=a[6];this.modem_control=a[7];this.modem_status=a[8];this.scratch_register=a[9];this.irq=a[10]};yc.prototype.CheckInterrupt=function(){this.ints&4096&&this.ier&1?(this.iir=12,this.cpu.device_raise_irq(this.irq)):this.ints&16&&this.ier&1?(this.iir=4,this.cpu.device_raise_irq(this.irq)):this.ints&4&&this.ier&2?(this.iir=2,this.cpu.device_raise_irq(this.irq)):this.ints&1&&this.ier&8?(this.iir=0,this.cpu.device_raise_irq(this.irq)):(this.iir=1,this.cpu.device_lower_irq(this.irq))};
|
|
356
|
+
yc.prototype.ThrowInterrupt=function(a){this.ints|=1<<a;this.CheckInterrupt()};yc.prototype.ClearInterrupt=function(a){this.ints&=~(1<<a);this.CheckInterrupt()};yc.prototype.data_received=function(a){B("input: "+n(a),16384);this.input.push(a);this.lsr|=1;this.fifo_control&1?this.ThrowInterrupt(12):this.ThrowInterrupt(4)};yc.prototype.write_data=function(a){this.line_control&128?this.baud_rate=this.baud_rate&-256|a:(B("data: "+n(a),16384),this.ThrowInterrupt(2),this.bus.send("serial"+this.com+"-output-byte",
|
|
357
|
+
a),a=String.fromCharCode(a),this.current_line+=a,"\n"===a&&(a=this.current_line.trimRight().replace(/[\x00-\x08\x0b-\x1f\x7f\x80-\xff]/g,""),B("SERIAL: "+a),this.current_line=""))};yc.prototype.set_modem_status=function(a){B("modem status: "+n(a),16384);const b=this.modem_status&15;let c=(this.modem_status^a)>>4;this.modem_status=a;this.modem_status=this.modem_status|c|b};function zc(a){this.pci_addr=new Uint8Array(4);this.pci_value=new Uint8Array(4);this.pci_response=new Uint8Array(4);this.pci_status=
|
|
358
|
+
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=a;for(var b=0;256>b;b++)this.device_spaces[b]=void 0,this.devices[b]=void 0;this.io=a.io;a.io.register_write(3324,this,function(c){this.pci_write8(this.pci_addr32[0],c)},function(c){this.pci_write16(this.pci_addr32[0],
|
|
359
|
+
c)},function(c){this.pci_write32(this.pci_addr32[0],c)});a.io.register_write(3325,this,function(c){this.pci_write8(this.pci_addr32[0]+1|0,c)});a.io.register_write(3326,this,function(c){this.pci_write8(this.pci_addr32[0]+2|0,c)},function(c){this.pci_write16(this.pci_addr32[0]+2|0,c)});a.io.register_write(3327,this,function(c){this.pci_write8(this.pci_addr32[0]+3|0,c)});a.io.register_read_consecutive(3324,this,function(){return this.pci_response[0]},function(){return this.pci_response[1]},function(){return this.pci_response[2]},
|
|
360
|
+
function(){return this.pci_response[3]});a.io.register_read_consecutive(3320,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]});a.io.register_write_consecutive(3320,this,function(c){this.pci_addr[0]=c&252},function(c){2===(this.pci_addr[1]&6)&&6===(c&6)?(B("CPU reboot via PCI"),a.reboot_internal()):this.pci_addr[1]=c},function(c){this.pci_addr[2]=c},function(c){this.pci_addr[3]=c;this.pci_query()});
|
|
361
|
+
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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,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=
|
|
362
|
+
this.register_device(this.isa_bridge);this.isa_bridge_space8=new Uint8Array(this.isa_bridge_space.buffer)}zc.prototype.get_state=function(){for(var a=[],b=0;256>b;b++)a[b]=this.device_spaces[b];a[256]=this.pci_addr;a[257]=this.pci_value;a[258]=this.pci_response;a[259]=this.pci_status;return a};zc.prototype.set_state=function(a){for(var b=0;256>b;b++){var c=this.devices[b],d=a[b];if(c&&d){for(var e=0;e<c.pci_bars.length;e++){var f=d[4+e];if(f&1){var g=c.pci_bars[e];this.set_io_bars(g,g.original_bar&
|
|
363
|
+
65534,f&65534)}}this.device_spaces[b].set(d)}else c&&B("Warning: While restoring PCI device: Device exists in current configuration but not in snapshot ("+c.name+")"),d&&B("Warning: While restoring PCI device: Device doesn't exist in current configuration but does in snapshot (device "+n(b,2)+")")}this.pci_addr.set(a[256]);this.pci_value.set(a[257]);this.pci_response.set(a[258]);this.pci_status.set(a[259])};zc.prototype.pci_query=function(){var a=this.pci_addr[2]<<8|this.pci_addr[1],b=this.pci_addr[0]&
|
|
364
|
+
252,c=a>>3&31;var d="query enabled="+(this.pci_addr[3]>>7)+(" bdf="+n(a,4));d+=" dev="+n(c,2);d+=" addr="+n(b,2);c=this.device_spaces[a];void 0!==c?(this.pci_status32[0]=-2147483648,this.pci_response32[0]=b<c.byteLength?c[b>>2]:0,d+=" "+n(this.pci_addr32[0]>>>0,8)+" -> "+n(this.pci_response32[0]>>>0,8),b>=c.byteLength&&(d+=" (undef)"),d+=" ("+this.devices[a].name+")",B(d,2048)):(this.pci_response32[0]=-1,this.pci_status32[0]=0)};zc.prototype.pci_write8=function(a,b){var c=a>>8&65535;a&=255;var d=
|
|
365
|
+
new Uint8Array(this.device_spaces[c].buffer),e=this.devices[c];d&&(l(!(16<=a&&44>a||48<=a&&52>a),"PCI: Expected 32-bit write, got 8-bit (addr: "+n(a)+")"),B("PCI write8 dev="+n(c>>3,2)+" ("+e.name+") addr="+n(a,4)+" value="+n(b,2),2048),d[a]=b)};zc.prototype.pci_write16=function(a,b){l(0===(a&1));var c=a>>8&65535;a&=255;var d=new Uint16Array(this.device_spaces[c].buffer),e=this.devices[c];d&&(16<=a&&44>a?B("Warning: PCI: Expected 32-bit write, got 16-bit (addr: "+n(a)+")"):(l(!(48<=a&&52>a),"PCI: Expected 32-bit write, got 16-bit (addr: "+
|
|
366
|
+
n(a)+")"),B("PCI writ16 dev="+n(c>>3,2)+" ("+e.name+") addr="+n(a,4)+" value="+n(b,4),2048),d[a>>>1]=b))};zc.prototype.pci_write32=function(a,b){l(0===(a&3));var c=a>>8&65535;a&=255;var d=this.device_spaces[c],e=this.devices[c];if(d)if(16<=a&&40>a){var f=a-16>>2,g=e.pci_bars[f];B("BAR"+f+" exists="+(g?"y":"n")+" changed from "+n(d[a>>2])+" to "+n(b>>>0)+" dev="+n(c>>3,2)+" ("+e.name+") ",2048);g?(l(!(g.size&g.size-1),"bar size should be power of 2"),c=a>>2,e=d[c]&1,-1===(b|3|g.size-1)?(b=~(g.size-
|
|
367
|
+
1)|e,0===e&&(d[c]=b)):0===e&&(f=g.original_bar,(b&-16)!==(f&-16)&&B("Warning: Changing memory bar not supported, ignored",2048),d[c]=f),1===e&&(l(1===e),e=d[c]&65534,f=b&65534,B("io bar changed from "+n(e>>>0,8)+" to "+n(f>>>0,8)+" size="+g.size,2048),this.set_io_bars(g,e,f),d[c]=b|1)):d[a>>2]=0;B("BAR effective value: "+n(d[a>>2]>>>0),2048)}else 48===a?(B("PCI write rom address dev="+n(c>>3,2)+" ("+e.name+") value="+n(b>>>0,8),2048),d[a>>2]=e.pci_rom_size?-1===(b|2047)?-e.pci_rom_size|0:e.pci_rom_address|
|
|
368
|
+
0:0):4===a?B("PCI write dev="+n(c>>3,2)+" ("+e.name+") addr="+n(a,4)+" value="+n(b>>>0,8),2048):(B("PCI write dev="+n(c>>3,2)+" ("+e.name+") addr="+n(a,4)+" value="+n(b>>>0,8),2048),d[a>>>2]=b)};zc.prototype.register_device=function(a){l(void 0!==a.pci_id);l(void 0!==a.pci_space);l(void 0!==a.pci_bars);var b=a.pci_id;B("PCI register bdf="+n(b)+" ("+a.name+")",2048);this.devices[b]&&B("warning: overwriting device "+this.devices[b].name+" with "+a.name,2048);l(64<=a.pci_space.length);l(b<this.devices.length);
|
|
369
|
+
var c=new Int32Array(64);c.set(new Int32Array((new Uint8Array(a.pci_space)).buffer));this.device_spaces[b]=c;this.devices[b]=a;b=c.slice(4,10);for(var d=0;d<a.pci_bars.length;d++){var e=a.pci_bars[d];if(e){var f=b[d],g=f&1;B("device "+a.name+" register bar of size "+e.size+" at "+n(f),2048);e.original_bar=f;e.entries=[];if(0!==g)for(l(1===g),f&=-2,g=0;g<e.size;g++)e.entries[g]=this.io.ports[f+g]}}return c};zc.prototype.set_io_bars=function(a,b,c){var d=a.size;B("Move io bars: from="+n(b)+" to="+n(c)+
|
|
370
|
+
" count="+d,2048);for(var e=this.io.ports,f=0;f<d;f++){4096<=b+f&&(e[b+f]=this.io.create_empty_entry());var g=a.entries[f],k=e[c+f];l(g&&k);4096<=c+f&&(e[c+f]=g)}};zc.prototype.raise_irq=function(a){var b=this.device_spaces[a];l(b);this.cpu.device_raise_irq(this.isa_bridge_space8[96+((b[15]>>8&255)-1+((a>>3)-1&255)&3)])};zc.prototype.lower_irq=function(a){var b=this.device_spaces[a];l(b);this.cpu.device_lower_irq(this.isa_bridge_space8[96+((b[15]>>8&255)+(a>>3&255)-2&3)])};function Ac(a,b,c){a[0]===
|
|
371
|
+
b[0]&&a[1]===b[1]&&a[2]===b[2]&&a[3]===b[3]&&a[4]===b[4]&&a[5]===b[5]&&(B("Replace mac in eth destination field",1048576),a[0]=c[0],a[1]=c[1],a[2]=c[2],a[3]=c[3],a[4]=c[4],a[5]=c[5]);a[6]===b[0]&&a[7]===b[1]&&a[8]===b[2]&&a[9]===b[3]&&a[10]===b[4]&&a[11]===b[5]&&(B("Replace mac in eth source field",1048576),a[6]=c[0],a[7]=c[1],a[8]=c[2],a[9]=c[3],a[10]=c[4],a[11]=c[5]);var d=a[12]<<8|a[13];if(2048===d)if(a=a.subarray(14),d=a[0]>>4,4!==d)B("Expected ipv4.version==4 but got: "+d,1048576);else{if(l(5===
|
|
372
|
+
(a[0]&15),"TODO: ihl!=5"),17===a[9]){a=a.subarray(20);d=a[0]<<8|a[1];var e=a[2]<<8|a[3];B("udp srcport="+d+" dstport="+e+" checksum="+n(a[6]<<8|a[7],4),1048576);if(67===d||67===e)if(d=a.subarray(8),e=d[236]<<24|d[237]<<16|d[238]<<8|d[239],1669485411!==e)B("dhcp packet didn't match magic: "+n(e,8));else for(d[28]===b[0]&&d[29]===b[1]&&d[30]===b[2]&&d[31]===b[3]&&d[32]===b[4]&&d[33]===b[5]&&(B("Replace mac in dhcp.chaddr",1048576),d[28]=c[0],d[29]=c[1],d[30]=c[2],d[31]=c[3],d[32]=c[4],d[33]=c[5],a[6]=
|
|
373
|
+
a[7]=0),e=240;e<d.length;){const f=d[e++];if(255===f)break;const g=d[e++];61===f&&1===d[e+0]&&d[e+1]===b[0]&&d[e+2]===b[1]&&d[e+3]===b[2]&&d[e+4]===b[3]&&d[e+5]===b[4]&&d[e+6]===b[5]&&(B("Replace mac in dhcp.clientidentifier",1048576),d[e+1]=c[0],d[e+2]=c[1],d[e+3]=c[2],d[e+4]=c[3],d[e+5]=c[4],d[e+6]=c[5],a[6]=a[7]=0);e+=g}}}else 2054===d&&(a=a.subarray(14),B("arp oper="+a[7]+" "+Bc(a.subarray(8,14))+" "+Bc(a.subarray(18,24)),1048576),a[8]===b[0]&&a[9]===b[1]&&a[10]===b[2]&&a[11]===b[3]&&a[12]===
|
|
374
|
+
b[4]&&a[13]===b[5]&&(B("Replace mac in arp.sha",1048576),a[8]=c[0],a[9]=c[1],a[10]=c[2],a[11]=c[3],a[12]=c[4],a[13]=c[5]))}function Bc(a){return[a[0].toString(16).padStart(2,"0"),a[1].toString(16).padStart(2,"0"),a[2].toString(16).padStart(2,"0"),a[3].toString(16).padStart(2,"0"),a[4].toString(16).padStart(2,"0"),a[5].toString(16).padStart(2,"0")].join(":")}function Cc(a,b,c,d,e){this.cpu=a;this.pci=a.devices.pci;this.id=e||0;this.preserve_mac_from_state_image=c;this.mac_address_translation=d;this.bus=
|
|
375
|
+
b;this.bus.register("net"+this.id+"-receive",function(f){this.receive(f)},this);this.port=768+256*this.id;this.name="ne2k";this.pci_space=[236,16,41,128,3,1,0,0,0,0,0,2,0,0,0,0,this.port&255|1,this.port>>8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,26,0,17,0,0,184,254,0,0,0,0,0,0,0,0,0,1,0,0];this.pci_id=(0===this.id?5:7+this.id)<<3;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;
|
|
376
|
+
this.tsr=1;this.mac=new Uint8Array([0,34,21,255*Math.random()|0,255*Math.random()|0,255*Math.random()|0]);this.bus.send("net"+this.id+"-mac",Bc(this.mac));this.mar=Uint8Array.of(255,255,255,255,255,255,255,255);this.mac_address_in_state=null;for(b=0;6>b;b++)this.memory[b<<1]=this.memory[b<<1|1]=this.mac[b];this.memory[28]=this.memory[29]=87;this.memory[30]=this.memory[31]=87;B("Mac: "+Bc(this.mac),1048576);this.rsar=0;this.pstart=64;this.pstop=128;this.boundary=this.curpg=76;b=a.io;b.register_read(this.port|
|
|
377
|
+
0,this,function(){B("Read cmd",1048576);return this.cr},function(){B("Read16 cmd",1048576);return this.cr});b.register_write(this.port|0,this,function(f){this.cr=f;B("Write command: "+n(f,2)+" newpg="+(this.cr>>6)+" txcr="+n(this.txcr,2),1048576);this.cr&1||(f&24&&0===this.rcnt&&this.do_interrupt(64),f&4&&(f=this.tpsr<<8,f=this.memory.subarray(f,f+this.tcnt),this.mac_address_in_state&&(f=new Uint8Array(f),Ac(f,this.mac_address_in_state,this.mac)),this.bus.send("net"+this.id+"-send",f),this.bus.send("eth-transmit-end",
|
|
378
|
+
[f.length]),this.cr&=-5,this.do_interrupt(2),B("Command: Transfer. length="+n(f.byteLength),1048576)))});b.register_read(this.port|13,this,function(){var f=this.get_page();if(1===f)return B("Read mar5",1048576),this.mar[5];B("Read counter0 pg="+f,1048576);return 0});b.register_read(this.port|14,this,function(){var f=this.get_page();if(1===f)return B("Read mar6",1048576),this.mar[6];B("Read8 counter1 pg="+f,1048576);return 0},function(){B("Read16 counter1 pg="+this.get_page(),1048576);return 0});b.register_read(this.port|
|
|
379
|
+
15,this,function(){var f=this.get_page();if(1===f)return B("Read mar7",1048576),this.mar[7];B("Read counter2 pg="+f,1048576);return 0});b.register_read(this.port|31,this,function(){this.get_page();B("Read reset",1048576);this.do_interrupt(128);return 0});b.register_write(this.port|31,this,function(f){this.get_page();B("Write reset: "+n(f,2),1048576)});b.register_read(this.port|1,this,function(){var f=this.get_page();if(0===f)return this.pstart;if(1===f)return B("Read pg1/01 (mac[0])",1048576),this.mac[0];
|
|
380
|
+
if(2===f)return this.pstart;B("Read pg"+f+"/01");l(!1);return 0});b.register_write(this.port|1,this,function(f){var g=this.get_page();0===g?(B("start page: "+n(f,2),1048576),this.pstart=f):1===g?(B("mac[0] = "+n(f),1048576),this.mac[0]=f):3===g?B("Unimplemented: Write pg3/01 (9346CR): "+n(f),1048576):(B("Write pg"+g+"/01: "+n(f),1048576),l(!1))});b.register_read(this.port|2,this,function(){var f=this.get_page();if(0===f)return this.pstop;if(1===f)return B("Read pg1/02 (mac[1])",1048576),this.mac[1];
|
|
381
|
+
if(2===f)return this.pstop;B("Read pg"+f+"/02",1048576);l(!1);return 0});b.register_write(this.port|2,this,function(f){var g=this.get_page();0===g?(B("stop page: "+n(f,2),1048576),f>this.memory.length>>8&&(f=this.memory.length>>8,B("XXX: Adjusting stop page to "+n(f),1048576)),this.pstop=f):1===g?(B("mac[1] = "+n(f),1048576),this.mac[1]=f):(B("Write pg"+g+"/02: "+n(f),1048576),l(!1))});b.register_read(this.port|7,this,function(){var f=this.get_page();if(0===f)return B("Read isr: "+n(this.isr,2),1048576),
|
|
382
|
+
this.isr;if(1===f)return B("Read curpg: "+n(this.curpg,2),1048576),this.curpg;l(!1);return 0});b.register_write(this.port|7,this,function(f){var g=this.get_page();0===g?(B("Write isr: "+n(f,2),1048576),this.isr&=~f,this.update_irq()):1===g?(B("Write curpg: "+n(f,2),1048576),this.curpg=f):l(!1)});b.register_write(this.port|13,this,function(f){var g=this.get_page();0===g?(this.txcr=f,B("Write tx config: "+n(f,2),1048576)):B("Unimplemented: Write pg"+g+"/0d "+n(f,2),1048576)});b.register_write(this.port|
|
|
383
|
+
14,this,function(f){var g=this.get_page();0===g?(B("Write data configuration: "+n(f,2),1048576),this.dcfg=f):B("Unimplemented: Write pg"+g+"/0e "+n(f,2),1048576)});b.register_read(this.port|10,this,function(){var f=this.get_page();if(0===f)return B("Read pg0/0a",1048576),80;if(1===f)return B("Read mar2",1048576),this.mar[2];l(!1,"TODO");return 0});b.register_write(this.port|10,this,function(f){var g=this.get_page();0===g?(B("Write remote byte count low: "+n(f,2),1048576),this.rcnt=this.rcnt&65280|
|
|
384
|
+
f&255):B("Unimplemented: Write pg"+g+"/0a "+n(f,2),1048576)});b.register_read(this.port|11,this,function(){var f=this.get_page();if(0===f)return B("Read pg0/0b",1048576),67;if(1===f)return B("Read mar3",1048576),this.mar[3];l(!1,"TODO");return 0});b.register_write(this.port|11,this,function(f){var g=this.get_page();0===g?(B("Write remote byte count high: "+n(f,2),1048576),this.rcnt=this.rcnt&255|f<<8&65280):B("Unimplemented: Write pg"+g+"/0b "+n(f,2),1048576)});b.register_read(this.port|8,this,function(){var f=
|
|
385
|
+
this.get_page();if(0===f)return B("Read remote start address low",1048576),this.rsar&255;if(1===f)return B("Read mar0",1048576),this.mar[0];B("Unimplemented: Read pg"+f+"/08",1048576);l(!1);return 0});b.register_write(this.port|8,this,function(f){var g=this.get_page();0===g?(B("Write remote start address low: "+n(f,2),1048576),this.rsar=this.rsar&65280|f&255):B("Unimplemented: Write pg"+g+"/08 "+n(f,2),1048576)});b.register_read(this.port|9,this,function(){var f=this.get_page();if(0===f)return B("Read remote start address high",
|
|
386
|
+
1048576),this.rsar>>8&255;if(1===f)return B("Read mar1",1048576),this.mar[1];B("Unimplemented: Read pg"+f+"/09",1048576);l(!1);return 0});b.register_write(this.port|9,this,function(f){var g=this.get_page();0===g?(B("Write remote start address low: "+n(f,2),1048576),this.rsar=this.rsar&255|f<<8&65280):B("Unimplemented: Write pg"+g+"/09 "+n(f,2),1048576)});b.register_write(this.port|15,this,function(f){var g=this.get_page();0===g?(B("Write interrupt mask register: "+n(f,2)+" isr="+n(this.isr,2),1048576),
|
|
387
|
+
this.imr=f,this.update_irq()):B("Unimplemented: Write pg"+g+"/0f "+n(f,2),1048576)});b.register_read(this.port|3,this,function(){var f=this.get_page();if(0===f)return B("Read boundary: "+n(this.boundary,2),1048576),this.boundary;if(1===f)return B("Read pg1/03 (mac[2])",1048576),this.mac[2];3===f?B("Unimplemented: Read pg3/03 (CONFIG0)",1048576):(B("Read pg"+f+"/03",1048576),l(!1));return 0});b.register_write(this.port|3,this,function(f){var g=this.get_page();0===g?(B("Write boundary: "+n(f,2),1048576),
|
|
388
|
+
this.boundary=f):1===g?(B("mac[2] = "+n(f),1048576),this.mac[2]=f):(B("Write pg"+g+"/03: "+n(f),1048576),l(!1))});b.register_read(this.port|4,this,function(){var f=this.get_page();if(0===f)return this.tsr;if(1===f)return B("Read pg1/04 (mac[3])",1048576),this.mac[3];B("Read pg"+f+"/04",1048576);l(!1);return 0});b.register_write(this.port|4,this,function(f){var g=this.get_page();0===g?(B("Write tpsr: "+n(f,2),1048576),this.tpsr=f):1===g?(B("mac[3] = "+n(f),1048576),this.mac[3]=f):(B("Write pg"+g+"/04: "+
|
|
389
|
+
n(f),1048576),l(!1))});b.register_read(this.port|5,this,function(){var f=this.get_page();if(0===f)return B("Unimplemented: Read pg0/05 (NCR: Number of Collisions Register)",1048576),0;if(1===f)return B("Read pg1/05 (mac[4])",1048576),this.mac[4];3===f?B("Unimplemented: Read pg3/05 (CONFIG2)",1048576):(B("Read pg"+f+"/05",1048576),l(!1));return 0});b.register_write(this.port|5,this,function(f){var g=this.get_page();0===g?(B("Write tcnt low: "+n(f,2),1048576),this.tcnt=this.tcnt&-256|f):1===g?(B("mac[4] = "+
|
|
390
|
+
n(f),1048576),this.mac[4]=f):3===g?B("Unimplemented: Write pg3/05 (CONFIG2): "+n(f),1048576):(B("Write pg"+g+"/05: "+n(f),1048576),l(!1))});b.register_read(this.port|6,this,function(){var f=this.get_page();if(0===f)return l(!1,"TODO"),0;if(1===f)return B("Read pg1/06 (mac[5])",1048576),this.mac[5];3===f?B("Unimplemented: Read pg3/06 (CONFIG3)",1048576):(B("Read pg"+f+"/06",1048576),l(!1));return 0});b.register_write(this.port|6,this,function(f){var g=this.get_page();0===g?(B("Write tcnt high: "+n(f,
|
|
391
|
+
2),1048576),this.tcnt=this.tcnt&255|f<<8):1===g?(B("mac[5] = "+n(f),1048576),this.mac[5]=f):3===g?B("Unimplemented: Write pg3/06 (CONFIG3): "+n(f),1048576):(B("Write pg"+g+"/06: "+n(f),1048576),l(!1))});b.register_read(this.port|12,this,function(){var f=this.get_page();if(0===f)return 9;if(1===f)return B("Read mar4",1048576),this.mar[4];B("Unimplemented: Read pg"+f+"/0c",1048576);l(!1);return 0});b.register_write(this.port|12,this,function(f){var g=this.get_page();0===g?(B("RX configuration reg write: "+
|
|
392
|
+
n(f,2),1048576),this.rxcr=f):B("Unimplemented: Write pg"+g+"/0c: "+n(f),1048576)});b.register_read(this.port|16,this,this.data_port_read8,this.data_port_read16,this.data_port_read32);b.register_write(this.port|16,this,this.data_port_write16,this.data_port_write16,this.data_port_write32);a.devices.pci.register_device(this)}Cc.prototype.get_state=function(){var a=[];a[0]=this.isr;a[1]=this.imr;a[2]=this.cr;a[3]=this.dcfg;a[4]=this.rcnt;a[5]=this.tcnt;a[6]=this.tpsr;a[7]=this.rsar;a[8]=this.pstart;a[9]=
|
|
393
|
+
this.curpg;a[10]=this.boundary;a[11]=this.pstop;a[12]=this.rxcr;a[13]=this.txcr;a[14]=this.tsr;a[15]=this.mac;a[16]=this.memory;return a};Cc.prototype.set_state=function(a){this.isr=a[0];this.imr=a[1];this.cr=a[2];this.dcfg=a[3];this.rcnt=a[4];this.tcnt=a[5];this.tpsr=a[6];this.rsar=a[7];this.pstart=a[8];this.curpg=a[9];this.boundary=a[10];this.pstop=a[11];this.rxcr=a[12];this.txcr=a[13];this.tsr=a[14];this.preserve_mac_from_state_image?(this.mac=a[15],this.memory=a[16]):this.mac_address_translation&&
|
|
394
|
+
(this.mac_address_in_state=a[15],this.memory=a[16],B("Using mac address translation guest_os_mac="+Bc(this.mac_address_in_state)+" real_mac="+Bc(this.mac),1048576));this.bus.send("net"+this.id+"-mac",Bc(this.mac))};Cc.prototype.do_interrupt=function(a){B("Do interrupt "+n(a,2),1048576);this.isr|=a;this.update_irq()};Cc.prototype.update_irq=function(){this.imr&this.isr?this.pci.raise_irq(this.pci_id):this.pci.lower_irq(this.pci_id)};Cc.prototype.data_port_write=function(a){if(16>=this.rsar||16384<=
|
|
395
|
+
this.rsar&&32768>this.rsar)this.memory[this.rsar]=a;this.rsar++;this.rcnt--;this.rsar>=this.pstop<<8&&(this.rsar+=this.pstart-this.pstop<<8);0===this.rcnt&&this.do_interrupt(64)};Cc.prototype.data_port_write16=function(a){this.data_port_write(a);this.dcfg&1&&this.data_port_write(a>>8)};Cc.prototype.data_port_write32=function(a){this.data_port_write(a);this.data_port_write(a>>8);this.data_port_write(a>>16);this.data_port_write(a>>24)};Cc.prototype.data_port_read=function(){let a=0;32768>this.rsar&&
|
|
396
|
+
(a=this.memory[this.rsar]);this.rsar++;this.rcnt--;this.rsar>=this.pstop<<8&&(this.rsar+=this.pstart-this.pstop<<8);0===this.rcnt&&this.do_interrupt(64);return a};Cc.prototype.data_port_read8=function(){return this.data_port_read16()&255};Cc.prototype.data_port_read16=function(){return this.dcfg&1?this.data_port_read()|this.data_port_read()<<8:this.data_port_read()};Cc.prototype.data_port_read32=function(){return this.data_port_read()|this.data_port_read()<<8|this.data_port_read()<<16|this.data_port_read()<<
|
|
397
|
+
24};Cc.prototype.receive=function(a){if(!(this.cr&1)&&(this.bus.send("eth-receive-end",[a.length]),this.rxcr&16||this.rxcr&4&&255===a[0]&&255===a[1]&&255===a[2]&&255===a[3]&&255===a[4]&&255===a[5]||!(this.rxcr&8&&1===(a[0]&1)||a[0]!==this.mac[0]||a[1]!==this.mac[1]||a[2]!==this.mac[2]||a[3]!==this.mac[3]||a[4]!==this.mac[4]||a[5]!==this.mac[5]))){this.mac_address_in_state&&(a=new Uint8Array(a),Ac(a,this.mac,this.mac_address_in_state));var b=this.curpg<<8,c=Math.max(60,a.length)+4,d=b+4,e=this.curpg+
|
|
398
|
+
1+(c>>8),f=b+c,g=1+(c>>8),k=this.boundary>this.curpg?this.boundary-this.curpg:this.pstop-this.curpg+this.boundary-this.pstart;k<g&&0!==this.boundary?B("Buffer full, dropping packet pstart="+n(this.pstart)+" pstop="+n(this.pstop)+" curpg="+n(this.curpg)+" needed="+n(g)+" boundary="+n(this.boundary)+" available="+n(k),1048576):(f>this.pstop<<8?(l(60<=a.length),f=(this.pstop<<8)-d,l(0<=f),this.memory.set(a.subarray(0,f),d),this.memory.set(a.subarray(f),this.pstart<<8),B("rcv cut="+n(f),1048576)):(this.memory.set(a,
|
|
399
|
+
d),60>a.length&&this.memory.fill(0,d+a.length,d+60)),e>=this.pstop&&(e+=this.pstart-this.pstop),this.memory[b]=1,this.memory[b+1]=e,this.memory[b+2]=c,this.memory[b+3]=c>>8,this.curpg=e,B("rcv offset="+n(b)+" len="+n(c)+" next="+n(e),1048576),this.do_interrupt(1))}};Cc.prototype.get_page=function(){return this.cr>>6&3};function Dc(a,b){this.bus=b;this.rows=25;this.cols=80;this.ports=4;b=[{size_supported:16,notify_offset:0},{size_supported:16,notify_offset:1},{size_supported:16,notify_offset:2},{size_supported:16,
|
|
400
|
+
notify_offset:3}];for(let c=1;c<this.ports;++c)b.push({size_supported:16,notify_offset:0}),b.push({size_supported:8,notify_offset:1});this.virtio=new Ec(a,{name:"virtio-console",pci_id:96,device_id:4163,subsystem_device_id:3,common:{initial_port:47104,queues:b,features:[0,1,32],on_driver_ok:()=>{}},notification:{initial_port:47360,single_handler:!1,handlers:[()=>{},c=>{const d=this.virtio.queues[c],e=3<c?c-3>>1:0;for(;d.has_request();){const f=d.pop_request(),g=new Uint8Array(f.length_readable);f.get_next_blob(g);
|
|
401
|
+
this.bus.send("virtio-console"+e+"-output-bytes",g);this.Ack(c,f)}},c=>{if(2!==c)l(!1,"VirtioConsole Notified for wrong queue: "+c+" (expected queue_id of 2)");else for(c=this.virtio.queues[c];c.count_requests()>c.size-2;)c.pop_request()},c=>{if(3!==c)l(!1,"VirtioConsole Notified for wrong queue: "+c+" (expected queue_id of 3)");else for(var d=this.virtio.queues[c];d.has_request();){var e=d.pop_request(),f=new Uint8Array(e.length_readable);e.get_next_blob(f);var g=K(["w","h","h"],f,{offset:0});f=
|
|
402
|
+
g[0];g=g[1];this.Ack(c,e);switch(g){case 0:for(e=0;e<this.ports;++e)this.SendEvent(e,1,0);break;case 3:this.Ack(c,e);this.SendEvent(f,4,1);this.SendName(f,"virtio-"+f);this.SendEvent(f,6,1);break;case 6:this.Ack(c,e);0===f&&this.SendWindowSize(f);break;default:l(!1," VirtioConsole received unknown event: "+g[1]);return}}}]},isr_status:{initial_port:46848},device_specific:{initial_port:46592,struct:[{bytes:2,name:"cols",read:()=>this.cols,write:()=>{}},{bytes:2,name:"rows",read:()=>this.rows,write:()=>
|
|
403
|
+
{}},{bytes:4,name:"max_nr_ports",read:()=>this.ports,write:()=>{}},{bytes:4,name:"emerg_wr",read:()=>0,write:()=>{l(!1,"Emergency write!")}}]}});for(let c=0;c<this.ports;++c){const d=0===c?0:2*c+2;this.bus.register("virtio-console"+c+"-input-bytes",function(e){var f=this.virtio.queues[d];f.has_request()&&(f=f.pop_request(),this.Send(d,f,new Uint8Array(e)))},this);this.bus.register("virtio-console"+c+"-resize",function(e){0===c&&(this.cols=e[0],this.rows=e[1]);this.virtio.queues[2].is_configured()&&
|
|
404
|
+
this.virtio.queues[2].has_request()&&this.SendWindowSize(c,e[0],e[1])},this)}}Dc.prototype.SendWindowSize=function(a,b,c){c=c||this.rows;b=b||this.cols;const d=this.virtio.queues[2].pop_request(),e=new Uint8Array(12);J(["w","h","h","h","h"],[a,5,0,c,b],e,0);this.Send(2,d,e)};Dc.prototype.SendName=function(a,b){const c=this.virtio.queues[2].pop_request();b=(new TextEncoder).encode(b);const d=new Uint8Array(8+b.length+1);J(["w","h","h"],[a,7,1],d,0);for(a=0;a<b.length;++a)d[a+8]=b[a];d[8+b.length]=
|
|
405
|
+
0;this.Send(2,c,d)};Dc.prototype.get_state=function(){const a=[];a[0]=this.virtio;a[1]=this.rows;a[2]=this.cols;a[3]=this.ports;return a};Dc.prototype.set_state=function(a){this.virtio.set_state(a[0]);this.rows=a[1];this.cols=a[2];this.ports=a[3]};Dc.prototype.reset=function(){this.virtio.reset()};Dc.prototype.SendEvent=function(a,b,c){const d=this.virtio.queues[2].pop_request(),e=new Uint8Array(8);J(["w","h","h"],[a,b,c],e,0);this.Send(2,d,e)};Dc.prototype.Send=function(a,b,c){b.set_next_blob(c);
|
|
406
|
+
this.virtio.queues[a].push_reply(b);this.virtio.queues[a].flush_replies()};Dc.prototype.Ack=function(a,b){b.set_next_blob(new Uint8Array(0));this.virtio.queues[a].push_reply(b);this.virtio.queues[a].flush_replies()};function Fc(a,b){this.cpu=a;this.bus=b;this.reset();this.bus.register("keyboard-code",function(c){this.kbd_send_code(c)},this);this.bus.register("mouse-click",function(c){this.mouse_send_click(c[0],c[1],c[2])},this);this.bus.register("mouse-delta",function(c){this.mouse_send_delta(c[0],
|
|
407
|
+
c[1])},this);this.bus.register("mouse-wheel",function(c){this.wheel_movement-=c[0];this.wheel_movement-=2*c[1];this.wheel_movement=Math.min(7,Math.max(-8,this.wheel_movement));this.send_mouse_packet(0,0)},this);a.io.register_read(96,this,this.port60_read);a.io.register_read(100,this,this.port64_read);a.io.register_write(96,this,this.port60_write);a.io.register_write(100,this,this.port64_write)}Fc.prototype.reset=function(){this.use_mouse=this.enable_mouse_stream=!1;this.have_mouse=!0;this.mouse_clicks=
|
|
408
|
+
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 na(1024);this.last_port60_byte=0;this.sample_rate=100;this.mouse_id=this.mouse_detect_state=0;this.mouse_reset_workaround=!1;this.wheel_movement=0;this.resolution=4;this.scaling2=!1;this.last_mouse_packet=-1;this.mouse_buffer=new na(1024);this.next_byte_is_aux=
|
|
409
|
+
this.next_byte_is_ready=!1;this.command_register=5;this.controller_output_port=0;this.read_controller_output_port=this.read_command_register=this.read_output_register=!1};Fc.prototype.get_state=function(){var a=[];a[0]=this.enable_mouse_stream;a[1]=this.use_mouse;a[2]=this.have_mouse;a[3]=this.mouse_delta_x;a[4]=this.mouse_delta_y;a[5]=this.mouse_clicks;a[6]=this.have_keyboard;a[7]=this.enable_keyboard_stream;a[8]=this.next_is_mouse_command;a[9]=this.next_read_sample;a[10]=this.next_read_led;a[11]=
|
|
410
|
+
this.next_handle_scan_code_set;a[12]=this.next_read_rate;a[13]=this.next_read_resolution;a[15]=this.last_port60_byte;a[16]=this.sample_rate;a[17]=this.resolution;a[18]=this.scaling2;a[20]=this.command_register;a[21]=this.read_output_register;a[22]=this.read_command_register;a[23]=this.controller_output_port;a[24]=this.read_controller_output_port;a[25]=this.mouse_id;a[26]=this.mouse_detect_state;a[27]=this.mouse_reset_workaround;return a};Fc.prototype.set_state=function(a){this.enable_mouse_stream=
|
|
411
|
+
a[0];this.use_mouse=a[1];this.have_mouse=a[2];this.mouse_delta_x=a[3];this.mouse_delta_y=a[4];this.mouse_clicks=a[5];this.have_keyboard=a[6];this.enable_keyboard_stream=a[7];this.next_is_mouse_command=a[8];this.next_read_sample=a[9];this.next_read_led=a[10];this.next_handle_scan_code_set=a[11];this.next_read_rate=a[12];this.next_read_resolution=a[13];this.last_port60_byte=a[15];this.sample_rate=a[16];this.resolution=a[17];this.scaling2=a[18];this.command_register=a[20];this.read_output_register=a[21];
|
|
412
|
+
this.read_command_register=a[22];this.controller_output_port=a[23];this.read_controller_output_port=a[24];this.mouse_id=a[25]||0;this.mouse_detect_state=a[26]||0;this.mouse_reset_workaround=a[27]||!1;this.next_byte_is_aux=this.next_byte_is_ready=!1;this.kbd_buffer.clear();this.mouse_buffer.clear();this.bus.send("mouse-enable",this.use_mouse)};Fc.prototype.raise_irq=function(){this.next_byte_is_ready||(this.kbd_buffer.length?this.kbd_irq():this.mouse_buffer.length&&this.mouse_irq())};Fc.prototype.mouse_irq=
|
|
413
|
+
function(){this.next_byte_is_aux=this.next_byte_is_ready=!0;this.command_register&2&&(B("Mouse irq",64),this.cpu.device_lower_irq(12),this.cpu.device_raise_irq(12))};Fc.prototype.kbd_irq=function(){this.next_byte_is_ready=!0;this.next_byte_is_aux=!1;this.command_register&1&&(B("Keyboard irq",64),this.cpu.device_lower_irq(1),this.cpu.device_raise_irq(1))};Fc.prototype.kbd_send_code=function(a){this.enable_keyboard_stream&&(B("adding kbd code: "+n(a),64),this.kbd_buffer.push(a),this.raise_irq())};Fc.prototype.mouse_send_delta=
|
|
414
|
+
function(a,b){this.have_mouse&&this.use_mouse&&(this.mouse_delta_x+=1*a,this.mouse_delta_y+=1*b,this.enable_mouse_stream&&(a=this.mouse_delta_x|0,b=this.mouse_delta_y|0,a||b))&&(this.mouse_delta_x-=a,this.mouse_delta_y-=b,this.send_mouse_packet(a,b))};Fc.prototype.mouse_send_click=function(a,b,c){this.have_mouse&&this.use_mouse&&(this.mouse_clicks=a|c<<1|b<<2,this.enable_mouse_stream&&this.send_mouse_packet(0,0))};Fc.prototype.send_mouse_packet=function(a,b){var c=(0>b)<<5|(0>a)<<4|8|this.mouse_clicks;
|
|
415
|
+
this.last_mouse_packet=Date.now();this.mouse_buffer.push(c);this.mouse_buffer.push(a);this.mouse_buffer.push(b);4===this.mouse_id?(this.mouse_buffer.push(0|this.wheel_movement&15),this.wheel_movement=0):3===this.mouse_id&&(this.mouse_buffer.push(this.wheel_movement&255),this.wheel_movement=0);this.raise_irq()};Fc.prototype.apply_scaling2=function(a){var b=a>>31;switch(Math.abs(a)){case 0:case 1:case 3:return a;case 2:return b;case 4:return 6*b;case 5:return 9*b;default:return a<<1}};Fc.prototype.port60_read=
|
|
416
|
+
function(){this.next_byte_is_ready=!1;if(!this.kbd_buffer.length&&!this.mouse_buffer.length)return B("Port 60 read: Empty",64),this.last_port60_byte;this.next_byte_is_aux?(this.cpu.device_lower_irq(12),this.last_port60_byte=this.mouse_buffer.shift(),B("Port 60 read (mouse): "+n(this.last_port60_byte),64)):(this.cpu.device_lower_irq(1),this.last_port60_byte=this.kbd_buffer.shift(),B("Port 60 read (kbd) : "+n(this.last_port60_byte),64));(this.kbd_buffer.length||this.mouse_buffer.length)&&this.raise_irq();
|
|
417
|
+
return this.last_port60_byte};Fc.prototype.port64_read=function(){var a=16;this.next_byte_is_ready&&(a|=1);this.next_byte_is_aux&&(a|=32);B("port 64 read: "+n(a),64);return a};Fc.prototype.port60_write=function(a){B("port 60 write: "+n(a),64);if(this.read_command_register)this.command_register=a,this.read_command_register=!1,B("Keyboard command register = "+n(this.command_register),64);else if(this.read_output_register)this.read_output_register=!1,this.mouse_buffer.clear(),this.mouse_buffer.push(a),
|
|
418
|
+
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=a;switch(this.mouse_detect_state){case -1:60===a?(this.mouse_reset_workaround=!0,this.mouse_detect_state=0):(this.mouse_reset_workaround=!1,this.mouse_detect_state=200===a?1:0);break;case 0:200===a&&(this.mouse_detect_state=1);break;case 1:this.mouse_detect_state=100===a?2:200===a?3:0;break;case 2:80===a&&(this.mouse_id=3);this.mouse_detect_state=-1;break;
|
|
419
|
+
case 3:80===a&&(this.mouse_id=4),this.mouse_detect_state=-1}B("mouse sample rate: "+n(a)+", mouse id: "+n(this.mouse_id),64);this.sample_rate||(B("invalid sample rate, reset to 100",64),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<a?(this.resolution=4,B("invalid resolution, resetting to 4",64)):(this.resolution=1<<a,B("resolution: "+this.resolution,64)),this.mouse_irq();else if(this.next_read_led)this.next_read_led=
|
|
420
|
+
!1,this.kbd_buffer.push(250),this.kbd_irq();else if(this.next_handle_scan_code_set)this.next_handle_scan_code_set=!1,this.kbd_buffer.push(250),this.kbd_irq(),a||this.kbd_buffer.push(1);else if(this.next_read_rate)this.next_read_rate=!1,this.kbd_buffer.push(250),this.kbd_irq();else if(this.next_is_mouse_command){if(this.next_is_mouse_command=!1,B("Port 60 data register write: "+n(a),64),this.have_mouse){this.kbd_buffer.clear();this.mouse_buffer.clear();this.mouse_buffer.push(250);switch(a){case 230:B("Scaling 1:1",
|
|
421
|
+
64);this.scaling2=!1;break;case 231:B("Scaling 2:1",64);this.scaling2=!0;break;case 232:this.next_read_resolution=!0;break;case 233:this.send_mouse_packet(0,0);break;case 235:B("unimplemented request single packet",64);this.send_mouse_packet(0,0);break;case 242:B("required id: "+n(this.mouse_id),64);this.mouse_buffer.push(this.mouse_id);this.mouse_clicks=this.mouse_delta_x=this.mouse_delta_y=0;this.raise_irq();break;case 243:this.next_read_sample=!0;break;case 244:this.use_mouse=this.enable_mouse_stream=
|
|
422
|
+
!0;this.bus.send("mouse-enable",!0);this.mouse_clicks=this.mouse_delta_x=this.mouse_delta_y=0;break;case 245:this.enable_mouse_stream=!1;break;case 246:this.enable_mouse_stream=!1;this.sample_rate=100;this.scaling2=!1;this.resolution=4;break;case 255:B("Mouse reset",64);this.mouse_buffer.push(170);this.mouse_buffer.push(0);this.use_mouse=!0;this.bus.send("mouse-enable",!0);this.enable_mouse_stream=!1;this.sample_rate=100;this.scaling2=!1;this.resolution=4;this.mouse_reset_workaround||(this.mouse_id=
|
|
423
|
+
0);this.mouse_clicks=this.mouse_delta_x=this.mouse_delta_y=0;break;default:B("Unimplemented mouse command: "+n(a),64)}this.mouse_irq()}}else if(this.read_controller_output_port)this.read_controller_output_port=!1,this.controller_output_port=a;else{B("Port 60 data register write: "+n(a),64);this.mouse_buffer.clear();this.kbd_buffer.clear();this.kbd_buffer.push(250);switch(a){case 237:this.next_read_led=!0;break;case 240:this.next_handle_scan_code_set=!0;break;case 242:this.kbd_buffer.push(171);this.kbd_buffer.push(131);
|
|
424
|
+
break;case 243:this.next_read_rate=!0;break;case 244:B("kbd enable scanning",64);this.enable_keyboard_stream=!0;break;case 245:B("kbd disable scanning",64);this.enable_keyboard_stream=!1;break;case 246:break;case 255:this.kbd_buffer.clear();this.kbd_buffer.push(250);this.kbd_buffer.push(170);this.kbd_buffer.push(0);break;default:B("Unimplemented keyboard command: "+n(a),64)}this.kbd_irq()}};Fc.prototype.port64_write=function(a){B("port 64 write: "+n(a),64);switch(a){case 32:this.kbd_buffer.clear();
|
|
425
|
+
this.mouse_buffer.clear();this.kbd_buffer.push(this.command_register);this.kbd_irq();break;case 96:this.read_command_register=!0;break;case 209:this.read_controller_output_port=!0;break;case 211:this.read_output_register=!0;break;case 212:this.next_is_mouse_command=!0;break;case 167:B("Disable second port",64);this.command_register|=32;break;case 168:B("Enable second port",64);this.command_register&=-33;break;case 169:this.kbd_buffer.clear();this.mouse_buffer.clear();this.kbd_buffer.push(0);this.kbd_irq();
|
|
426
|
+
break;case 170:this.kbd_buffer.clear();this.mouse_buffer.clear();this.kbd_buffer.push(85);this.kbd_irq();break;case 171:this.kbd_buffer.clear();this.mouse_buffer.clear();this.kbd_buffer.push(0);this.kbd_irq();break;case 173:B("Disable Keyboard",64);this.command_register|=16;break;case 174:B("Enable Keyboard",64);this.command_register&=-17;break;case 254:B("CPU reboot via PS2");this.cpu.reboot_internal();break;default:B("port 64: Unimplemented command byte: "+n(a),64)}};const Gc=DataView.prototype,
|
|
427
|
+
Hc={size:1,get:Gc.getUint8,set:Gc.setUint8},Ic={size:2,get:Gc.getUint16,set:Gc.setUint16},Q={size:4,get:Gc.getUint32,set:Gc.setUint32},Kc=Jc([{magic:Q},{class:Hc},{data:Hc},{version0:Hc},{osabi:Hc},{abiversion:Hc},{pad0:function(a){return{size:a,get:()=>-1}}(7)},{type:Ic},{machine:Ic},{version1:Q},{entry:Q},{phoff:Q},{shoff:Q},{flags:Q},{ehsize:Ic},{phentsize:Ic},{phnum:Ic},{shentsize:Ic},{shnum:Ic},{shstrndx:Ic}]);console.assert(52===Kc.reduce((a,b)=>a+b.size,0));const Lc=Jc([{type:Q},{offset:Q},
|
|
428
|
+
{vaddr:Q},{paddr:Q},{filesz:Q},{memsz:Q},{flags:Q},{align:Q}]);console.assert(32===Lc.reduce((a,b)=>a+b.size,0));const Mc=Jc([{name:Q},{type:Q},{flags:Q},{addr:Q},{offset:Q},{size:Q},{link:Q},{info:Q},{addralign:Q},{entsize:Q}]);console.assert(40===Mc.reduce((a,b)=>a+b.size,0));function Jc(a){return a.map(function(b){var c=Object.keys(b);console.assert(1===c.length);c=c[0];b=b[c];console.assert(0<b.size);return{name:c,type:b,size:b.size,get:b.get,set:b.set}})}function Nc(a,b){const c={};let d=0;for(const e of b)b=
|
|
429
|
+
e.get.call(a,d,!0),console.assert(void 0===c[e.name]),c[e.name]=b,d+=e.size;return[c,d]}function Oc(a,b,c){const d=[];let e=0;for(var f=0;f<c;f++){const [g,k]=Nc(new DataView(a.buffer,a.byteOffset+e,void 0),b);d.push(g);e+=k}return[d,e]}const Pc={[0]:0,[1]:525,[2]:525,[3]:350,[4]:350,[5]:350};function W(a,b,c,d){this.io=a.io;this.cpu=a;this.dma=a.devices.dma;this.cmd_table=this.build_cmd_lookup_table();this.sra=0;this.srb=192;this.dor=12;this.tdr=0;this.msr=128;this.dsr=0;this.cmd_phase=1;this.cmd_flags=
|
|
430
|
+
this.cmd_code=0;this.cmd_buffer=new Uint8Array(17);this.cmd_remaining=this.cmd_cursor=0;this.response_data=new Uint8Array(15);this.reset_sense_int_count=this.curr_drive_no=this.status1=this.status0=this.response_length=this.response_cursor=0;this.locked=!1;this.head_load_time=this.step_rate_interval=0;this.fdc_config=96;this.eot=this.precomp_trk=0;this.drives=[new Qc("fda",d?.fda,b,4),new Qc("fdb",d?.fdb,c,4)];Object.seal(this);this.cpu.devices.rtc.cmos_write(16,this.drives[0].drive_type<<4|this.drives[1].drive_type);
|
|
431
|
+
this.io.register_read(1008,this,this.read_reg_sra);this.io.register_read(1009,this,this.read_reg_srb);this.io.register_read(1010,this,this.read_reg_dor);this.io.register_read(1011,this,this.read_reg_tdr);this.io.register_read(1012,this,this.read_reg_msr);this.io.register_read(1013,this,this.read_reg_fifo);this.io.register_read(1015,this,this.read_reg_dir);this.io.register_write(1010,this,this.write_reg_dor);this.io.register_write(1011,this,this.write_reg_tdr);this.io.register_write(1012,this,this.write_reg_dsr);
|
|
432
|
+
this.io.register_write(1013,this,this.write_reg_fifo);this.io.register_write(1015,this,this.write_reg_ccr);B("floppy controller ready",8192)}W.prototype.build_cmd_lookup_table=function(){const a=[{code:6,mask:31,argc:8,name:"READ",handler:this.exec_read},{code:5,mask:63,argc:8,name:"WRITE",handler:this.exec_write},{code:15,mask:255,argc:2,name:"SEEK",handler:this.exec_seek},{code:8,mask:255,argc:0,name:"SENSE INTERRUPT STATUS",handler:this.exec_sense_interrupt_status},{code:7,mask:255,argc:1,name:"RECALIBRATE",
|
|
433
|
+
handler:this.exec_recalibrate},{code:13,mask:191,argc:5,name:"FORMAT TRACK",handler:this.exec_format_track},{code:2,mask:191,argc:8,name:"READ TRACK",handler:this.exec_unimplemented},{code:78,mask:255,argc:17,name:"RESTORE",handler:this.exec_unimplemented},{code:46,mask:255,argc:0,name:"SAVE",handler:this.exec_unimplemented},{code:12,mask:31,argc:8,name:"READ DELETED DATA",handler:this.exec_unimplemented},{code:17,mask:31,argc:8,name:"SCAN EQUAL",handler:this.exec_unimplemented},{code:22,mask:31,
|
|
434
|
+
argc:8,name:"VERIFY",handler:this.exec_unimplemented},{code:25,mask:31,argc:8,name:"SCAN LOW OR EQUAL",handler:this.exec_unimplemented},{code:29,mask:31,argc:8,name:"SCAN HIGH OR EQUAL",handler:this.exec_unimplemented},{code:9,mask:63,argc:8,name:"WRITE DELETED DATA",handler:this.exec_unimplemented},{code:10,mask:191,argc:1,name:"READ ID",handler:this.exec_read_id},{code:3,mask:255,argc:2,name:"SPECIFY",handler:this.exec_specify},{code:4,mask:255,argc:1,name:"SENSE DRIVE STATUS",handler:this.exec_sense_drive_status},
|
|
435
|
+
{code:18,mask:255,argc:1,name:"PERPENDICULAR MODE",handler:this.exec_perpendicular_mode},{code:19,mask:255,argc:3,name:"CONFIGURE",handler:this.exec_configure},{code:23,mask:255,argc:2,name:"POWERDOWN MODE",handler:this.exec_unimplemented},{code:51,mask:255,argc:1,name:"OPTION",handler:this.exec_unimplemented},{code:142,mask:255,argc:5,name:"DRIVE SPECIFICATION",handler:this.exec_unimplemented},{code:143,mask:255,argc:2,name:"RELATIVE SEEK OUT",handler:this.exec_unimplemented},{code:205,mask:255,
|
|
436
|
+
argc:10,name:"FORMAT AND WRITE",handler:this.exec_unimplemented},{code:207,mask:255,argc:2,name:"RELATIVE SEEK IN",handler:this.exec_unimplemented},{code:20,mask:127,argc:0,name:"LOCK",handler:this.exec_lock},{code:14,mask:255,argc:0,name:"DUMP REGISTERS",handler:this.exec_dump_regs},{code:16,mask:255,argc:0,name:"VERSION",handler:this.exec_version},{code:24,mask:255,argc:0,name:"PART ID",handler:this.exec_part_id},{code:0,mask:0,argc:0,name:"UNKNOWN COMMAND",handler:this.exec_unimplemented}],b=Array(256);
|
|
437
|
+
for(let c=a.length-1;0<=c;c--){const d=a[c];if(255===d.mask)b[d.code]=d;else for(let e=0;256>e;e++)(e&d.mask)===d.code&&(b[e]=d)}return b};W.prototype.raise_irq=function(a){this.sra&128||(this.cpu.device_raise_irq(6),this.sra|=128,B("IRQ raised, reason: "+a,8192));this.reset_sense_int_count=0};W.prototype.lower_irq=function(a){this.status0=0;this.sra&128&&(this.cpu.device_lower_irq(6),this.sra&=-129,B("IRQ lowered, reason: "+a,8192))};W.prototype.set_curr_drive_no=function(a){this.curr_drive_no=a&
|
|
438
|
+
1;return this.drives[this.curr_drive_no]};W.prototype.enter_command_phase=function(){this.cmd_phase=1;this.cmd_remaining=this.cmd_cursor=0;this.msr&=-81;this.msr|=128};W.prototype.enter_result_phase=function(a){this.cmd_phase=3;this.response_cursor=0;this.response_length=a;this.msr|=208};W.prototype.reset_fdc=function(){B("resetting controller",8192);this.lower_irq("controller reset");this.sra=0;this.srb=192;this.dor=12;this.msr=128;this.curr_drive_no=0;this.status0|=192;this.response_length=this.response_cursor=
|
|
439
|
+
0;this.drives[0].seek(0,0,1);this.drives[1].seek(0,0,1);this.enter_command_phase();this.raise_irq("controller reset");this.reset_sense_int_count=4};W.prototype.read_reg_sra=function(){B("SRA read: "+n(this.sra),8192);return this.sra};W.prototype.read_reg_srb=function(){B("SRB read: "+n(this.srb),8192);return this.srb};W.prototype.read_reg_dor=function(){const a=this.dor&-4|this.curr_drive_no;B("DOR read: "+n(a),8192);return a};W.prototype.read_reg_tdr=function(){B("TDR read: "+n(this.tdr),8192);return this.tdr};
|
|
440
|
+
W.prototype.read_reg_msr=function(){B("MSR read: "+n(this.msr),8192);this.dsr&=-65;this.dor|=4;return this.msr};W.prototype.read_reg_fifo=function(){this.dsr&=-65;if(!(this.msr&128&&this.msr&64))return B("FIFO read rejected: controller not ready for reading",8192),0;if(3!==this.cmd_phase)return B("FIFO read rejected: floppy controller not in RESULT phase, phase: "+this.cmd_phase,8192),0;if(this.response_cursor<this.response_length){const a=this.response_data[this.response_cursor++];if(this.response_cursor===
|
|
441
|
+
this.response_length){const b="end of "+this.cmd_table[this.cmd_code].name+" response";this.msr&=-129;this.enter_command_phase();this.lower_irq(b)}return a}B("FIFO read: empty",8192);return 0};W.prototype.read_reg_dir=function(){const a=this.drives[this.curr_drive_no].media_changed?128:0;B("DIR read: "+n(a),8192);return a};W.prototype.write_reg_dor=function(a){this.srb=this.srb&-36|(a&16?1:0)|(a&32?2:0)|(a&1?32:0);this.dor&4?a&4||B("enter RESET state",8192):a&4&&(this.reset_fdc(),this.dsr&=-65,B("exit RESET state",
|
|
442
|
+
8192));const b=a&3;B("DOR write: "+n(a)+", motors: "+n(a>>4)+", dma: "+!!(a&8)+", reset: "+!(a&4)+", drive: "+b,8192);1<b&&B("*** WARNING: floppy drive number "+b+" not implemented!",8192);this.curr_drive_no=b&1;this.dor=a};W.prototype.write_reg_tdr=function(a){this.dor&4?(B("TDR write: "+n(a),8192),this.tdr=a&4):B("TDR write "+n(a)+" rejected: Floppy controller in RESET mode!",8192)};W.prototype.write_reg_dsr=function(a){this.dor&4?(B("DSR write: "+n(a),8192),a&128&&(this.dor&=-5,this.reset_fdc(),
|
|
443
|
+
this.dor|=4),a&64&&this.reset_fdc(),this.dsr=a):B("DSR write: "+n(a)+" rejected: Floppy controller in RESET mode!",8192)};W.prototype.write_reg_fifo=function(a){this.dsr&=-65;if(this.dor&4)if(!(this.msr&128)||this.msr&64)B("FIFO write "+n(a)+" rejected: controller not ready for writing",8192);else if(1!==this.cmd_phase)B("FIFO write "+n(a)+" rejected: floppy controller not in COMMAND phase, phase: "+this.cmd_phase,8192);else{if(0===this.cmd_remaining){var b=this.cmd_table[a];this.cmd_code=a;this.cmd_remaining=
|
|
444
|
+
b.argc;this.cmd_flags=this.cmd_cursor=0;(6===b.code||5===b.code)&&this.cmd_code&128&&(this.cmd_flags|=1);this.cmd_remaining&&(this.msr|=128);this.msr|=16}else this.cmd_buffer[this.cmd_cursor++]=a,this.cmd_remaining--;if(0===this.cmd_remaining){this.cmd_phase=2;a=this.cmd_table[this.cmd_code];b=this.cmd_buffer.slice(0,this.cmd_cursor);const c=[];for(const d of b)c.push(n(d,2));B("FD command "+n(this.cmd_code)+": "+a.name+"("+c.join(", ")+")",8192);a.handler.call(this,b)}}else B("FIFO write "+n(a)+
|
|
445
|
+
" rejected: floppy controller in RESET mode!",8192)};W.prototype.write_reg_ccr=function(a){this.dor&4?(B("CCR write: "+n(a),8192),this.dsr=this.dsr&-4|a&3):B("CCR write: "+n(a)+" rejected: Floppy controller in RESET mode!",8192)};W.prototype.exec_unimplemented=function(){l(!1,"Unimplemented floppy command code "+n(this.cmd_code)+"!");this.status0=128;this.response_data[0]=this.status0;this.enter_result_phase(1)};W.prototype.exec_read=function(a){this.start_read_write(a,!1)};W.prototype.exec_write=
|
|
446
|
+
function(a){this.start_read_write(a,!0)};W.prototype.exec_seek=function(a){const b=this.set_curr_drive_no(a[0]&1);a=a[1];this.enter_command_phase();b.seek(b.curr_head,a,b.curr_sect);this.status0|=32;this.raise_irq("SEEK command")};W.prototype.exec_sense_interrupt_status=function(){const a=this.drives[this.curr_drive_no];let b;if(0<this.reset_sense_int_count)b=192|4-this.reset_sense_int_count--;else if(this.sra&128)b=this.status0&-8|this.curr_drive_no;else{B("No interrupt pending, aborting SENSE INTERRUPT command!",
|
|
447
|
+
8192);this.response_data[0]=128;this.enter_result_phase(1);return}this.response_data[0]=b;this.response_data[1]=a.curr_track;this.enter_result_phase(2);this.lower_irq("SENSE INTERRUPT command");this.status0=192};W.prototype.exec_recalibrate=function(a){this.set_curr_drive_no(a[0]&1).seek(0,0,1);this.enter_command_phase();this.status0|=32;this.raise_irq("RECALIBRATE command")};W.prototype.exec_format_track=function(a){let b=0,c=0;this.set_curr_drive_no(a[0]&1).read_only&&(b=96,c=2);this.end_read_write(b,
|
|
448
|
+
c,0)};W.prototype.exec_read_id=function(a){const b=this.drives[this.curr_drive_no];b.curr_head=a[0]>>2&1;0!==b.max_sect&&(b.curr_sect=b.curr_sect%b.max_sect+1);this.end_read_write(0,0,0)};W.prototype.exec_specify=function(a){const b=a[1];this.step_rate_interval=a[0]>>4;this.head_load_time=b>>1;this.dor=b&1?this.dor&-9:this.dor|8;this.enter_command_phase()};W.prototype.exec_sense_drive_status=function(a){a=a[0];const b=this.set_curr_drive_no(a&1);b.curr_head=a>>2&1;this.response_data[0]=(b.read_only?
|
|
449
|
+
64:0)|(0===b.curr_track?16:0)|b.curr_head<<2|this.curr_drive_no|40;this.enter_result_phase(1)};W.prototype.exec_perpendicular_mode=function(a){a=a[0];a&128&&(this.drives[this.curr_drive_no].perpendicular=a&7);this.enter_command_phase()};W.prototype.exec_configure=function(a){this.fdc_config=a[1];this.precomp_trk=a[2];this.enter_command_phase()};W.prototype.exec_lock=function(){this.cmd_code&128?(this.locked=!0,this.response_data[0]=16):(this.locked=!1,this.response_data[0]=0);this.enter_result_phase(1)};
|
|
450
|
+
W.prototype.exec_dump_regs=function(){const a=this.drives[this.curr_drive_no];this.response_data[0]=this.drives[0].curr_track;this.response_data[1]=this.drives[1].curr_track;this.response_data[2]=0;this.response_data[3]=0;this.response_data[4]=this.step_rate_interval;this.response_data[5]=this.head_load_time<<1|(this.dor&8?1:0);this.response_data[6]=a.max_sect;this.response_data[7]=(this.locked?128:0)|a.perpendicular<<2;this.response_data[8]=this.fdc_config;this.response_data[9]=this.precomp_trk;
|
|
451
|
+
this.enter_result_phase(10)};W.prototype.exec_version=function(){this.response_data[0]=144;this.enter_result_phase(1)};W.prototype.exec_part_id=function(){this.response_data[0]=65;this.enter_result_phase(1)};W.prototype.start_read_write=function(a,b){const c=this.set_curr_drive_no(a[0]&1),d=a[1],e=a[2],f=a[3];var g=a[4];const k=a[5];a=128>a[7]?a[7]:128;switch(c.seek(e,d,f)){case 2:this.end_read_write(64,0,0);this.response_data[3]=d;this.response_data[4]=e;this.response_data[5]=f;return;case 3:this.end_read_write(64,
|
|
452
|
+
128,0);this.response_data[3]=d;this.response_data[4]=e;this.response_data[5]=f;return;case 1:this.status0|=32}const m=128<<(7<g?7:g);g=c.chs2lba(d,e,f)*m;if(128===m)b&&128>a&&l(!1,"dtl="+a+" is less than 128, zero-padding is still unimplemented!");else if(a=this.cmd_flags&1?(2*k-f+1)*m:(k-f+1)*m,0>=a){B("invalid data_length: "+a+" sect="+f+" eot="+k,8192);this.end_read_write(64,1,0);this.response_data[3]=d;this.response_data[4]=e;this.response_data[5]=f;return}this.eot=k;B("Floppy "+this.cmd_table[this.cmd_code].name+
|
|
453
|
+
" from: "+n(g)+", length: "+n(a)+", C/H/S: "+d+"/"+e+"/"+f+", ro: "+c.read_only+", #S: "+c.max_sect+", #H: "+c.max_head,8192);b&&c.read_only?(this.end_read_write(96,2,0),this.response_data[3]=d,this.response_data[4]=e,this.response_data[5]=f):this.dor&8?(this.msr&=-129,(b?this.dma.do_write:this.dma.do_read).call(this.dma,c.buffer,g,a,2,p=>{p?(B("DMA floppy error",8192),this.end_read_write(64,0,0)):(this.seek_next_sect(),this.end_read_write(0,0,0))})):l(!1,this.cmd_table[this.cmd_code].name+" in PIO mode not supported!")};
|
|
454
|
+
W.prototype.end_read_write=function(a,b,c){const d=this.drives[this.curr_drive_no];this.status0&=-8;this.status0|=this.curr_drive_no;d.curr_head&&(this.status0|=4);this.status0|=a;this.msr|=192;this.msr&=-33;this.response_data[0]=this.status0;this.response_data[1]=b;this.response_data[2]=c;this.response_data[3]=d.curr_track;this.response_data[4]=d.curr_head;this.response_data[5]=d.curr_sect;this.response_data[6]=2;this.enter_result_phase(7);this.raise_irq(this.cmd_table[this.cmd_code].name+" command")};
|
|
455
|
+
W.prototype.seek_next_sect=function(){const a=this.drives[this.curr_drive_no];let b=a.curr_track,c=a.curr_head,d=a.curr_sect,e=1;d>=a.max_sect||d===this.eot?(d=1,this.cmd_flags&1?0===c&&2===a.max_head?c=1:(c=0,b++,this.status0|=32,1===a.max_head&&(e=0)):(this.status0|=32,b++,e=0)):d++;a.seek(c,b,d);return e};W.prototype.get_state=function(){const a=[];a[19]=this.sra;a[20]=this.srb;a[21]=this.dor;a[22]=this.tdr;a[23]=this.msr;a[24]=this.dsr;a[25]=this.cmd_phase;a[26]=this.cmd_code;a[27]=this.cmd_flags;
|
|
456
|
+
a[28]=this.cmd_buffer;a[29]=this.cmd_cursor;a[30]=this.cmd_remaining;a[31]=this.response_data;a[32]=this.response_cursor;a[33]=this.response_length;a[34]=this.status0;a[35]=this.status1;a[36]=this.curr_drive_no;a[37]=this.reset_sense_int_count;a[38]=this.locked;a[39]=this.step_rate_interval;a[40]=this.head_load_time;a[41]=this.fdc_config;a[42]=this.precomp_trk;a[43]=this.eot;a[44]=this.drives[0].get_state();a[45]=this.drives[1].get_state();return a};W.prototype.set_state=function(a){"undefined"!==
|
|
457
|
+
typeof a[19]&&(this.sra=a[19],this.srb=a[20],this.dor=a[21],this.tdr=a[22],this.msr=a[23],this.dsr=a[24],this.cmd_phase=a[25],this.cmd_code=a[26],this.cmd_flags=a[27],this.cmd_buffer.set(a[28]),this.cmd_cursor=a[29],this.cmd_remaining=a[30],this.response_data.set(a[31]),this.response_cursor=a[32],this.response_length=a[33],this.status0=a[34],this.status1=a[35],this.curr_drive_no=a[36],this.reset_sense_int_count=a[37],this.locked=a[38],this.step_rate_interval=a[39],this.head_load_time=a[40],this.fdc_config=
|
|
458
|
+
a[41],this.precomp_trk=a[42],this.eot=a[43],this.drives[0].set_state(a[44]),this.drives[1].set_state(a[45]))};const Rc=[{drive_type:4,sectors:18,tracks:80,heads:2},{drive_type:4,sectors:20,tracks:80,heads:2},{drive_type:4,sectors:21,tracks:80,heads:2},{drive_type:4,sectors:21,tracks:82,heads:2},{drive_type:4,sectors:21,tracks:83,heads:2},{drive_type:4,sectors:22,tracks:80,heads:2},{drive_type:4,sectors:23,tracks:80,heads:2},{drive_type:4,sectors:24,tracks:80,heads:2},{drive_type:5,sectors:36,tracks:80,
|
|
459
|
+
heads:2},{drive_type:5,sectors:39,tracks:80,heads:2},{drive_type:5,sectors:40,tracks:80,heads:2},{drive_type:5,sectors:44,tracks:80,heads:2},{drive_type:5,sectors:48,tracks:80,heads:2},{drive_type:4,sectors:8,tracks:80,heads:2},{drive_type:4,sectors:9,tracks:80,heads:2},{drive_type:4,sectors:10,tracks:80,heads:2},{drive_type:4,sectors:10,tracks:82,heads:2},{drive_type:4,sectors:10,tracks:83,heads:2},{drive_type:4,sectors:13,tracks:80,heads:2},{drive_type:4,sectors:14,tracks:80,heads:2},{drive_type:2,
|
|
460
|
+
sectors:15,tracks:80,heads:2},{drive_type:2,sectors:18,tracks:80,heads:2},{drive_type:2,sectors:18,tracks:82,heads:2},{drive_type:2,sectors:18,tracks:83,heads:2},{drive_type:2,sectors:20,tracks:80,heads:2},{drive_type:2,sectors:9,tracks:80,heads:2},{drive_type:2,sectors:11,tracks:80,heads:2},{drive_type:2,sectors:9,tracks:40,heads:2},{drive_type:2,sectors:9,tracks:40,heads:1},{drive_type:2,sectors:10,tracks:41,heads:2},{drive_type:2,sectors:10,tracks:42,heads:2},{drive_type:2,sectors:8,tracks:40,
|
|
461
|
+
heads:2},{drive_type:2,sectors:8,tracks:40,heads:1},{drive_type:4,sectors:9,tracks:80,heads:1},{drive_type:1,sectors:10,tracks:40,heads:1},{drive_type:1,sectors:10,tracks:40,heads:2}];function Qc(a,b,c,d){this.name=a;this.curr_head=this.curr_track=this.max_sect=this.max_head=this.max_track=this.drive_type=0;this.curr_sect=1;this.perpendicular=0;this.read_only=!1;this.media_changed=!0;this.buffer=null;Object.seal(this);a=b?.drive_type;void 0!==a&&0<=a&&5>=a&&(this.drive_type=a);this.insert_disk(c,
|
|
462
|
+
!!b?.read_only);0===this.drive_type&&void 0===a&&(this.drive_type=d);B("floppy drive "+this.name+" ready, drive type: "+this.drive_type,8192)}Qc.prototype.insert_disk=function(a,b){if(!a)return!1;a instanceof Uint8Array&&(a=new za(a.buffer));const [c,d]=this.find_disk_format(a,this.drive_type);if(!c)return B("WARNING: disk rejected, no suitable disk format found for image of size "+a.byteLength+" bytes",8192),!1;this.max_track=d.tracks;this.max_head=d.heads;this.max_sect=d.sectors;this.read_only=
|
|
463
|
+
!!b;this.media_changed=!0;this.buffer=c;0===this.drive_type&&(this.drive_type=d.drive_type);B("disk inserted into "+this.name+": type: "+d.drive_type+", C/H/S: "+d.tracks+"/"+d.heads+"/"+d.sectors+", size: "+c.byteLength,8192);return!0};Qc.prototype.eject_disk=function(){this.max_sect=this.max_head=this.max_track=0;this.media_changed=!0;this.buffer=null};Qc.prototype.get_buffer=function(){return this.buffer?this.buffer.buffer:null};Qc.prototype.chs2lba=function(a,b,c){return(a*this.max_head+b)*this.max_sect+
|
|
464
|
+
c-1};Qc.prototype.find_disk_format=function(a,b){const c=0===b,d=a.byteLength;let e=-1,f=-1,g=-1,k=-1,m=-1;for(let p=0;p<Rc.length;p++){const q=Rc[p],r=q.sectors*q.tracks*q.heads*512;if(d===r)if(c||q.drive_type===b){e=p;break}else c||Pc[q.drive_type]!==Pc[b]?g=-1===g?p:g:f=-1===f?p:f;else d<r&&(-1===m||r<m)&&(k=p,m=r)}return-1!==e?[a,Rc[e]]:-1!==f?[a,Rc[f]]:-1!==g?[a,Rc[g]]:-1!==k?(b=new Uint8Array(m),b.set(new Uint8Array(a.buffer)),[new za(b.buffer),Rc[k]]):[null,null]};Qc.prototype.seek=function(a,
|
|
465
|
+
b,c){if(b>this.max_track||0!==a&&1===this.max_head)return B("WARNING: attempt to seek to invalid track: head: "+a+", track: "+b+", sect: "+c,8192),2;if(c>this.max_sect)return B("WARNING: attempt to seek beyond last sector: "+c+" (max: "+this.max_sect+")",8192),3;let d=0;const e=this.chs2lba(this.curr_track,this.curr_head,this.curr_sect),f=this.chs2lba(b,a,c);e!==f&&(this.curr_track!==b&&(this.buffer&&(this.media_changed=!1),d=1),this.curr_head=a,this.curr_track=b,this.curr_sect=c);this.buffer||(d=
|
|
466
|
+
2);return d};Qc.prototype.get_state=function(){const a=[];a[0]=this.drive_type;a[1]=this.max_track;a[2]=this.max_head;a[3]=this.max_sect;a[4]=this.curr_track;a[5]=this.curr_head;a[6]=this.curr_sect;a[7]=this.perpendicular;a[8]=this.read_only;a[9]=this.media_changed;a[10]=this.buffer?this.buffer.get_state():null;return a};Qc.prototype.set_state=function(a){this.drive_type=a[0];this.max_track=a[1];this.max_head=a[2];this.max_sect=a[3];this.curr_track=a[4];this.curr_head=a[5];this.curr_sect=a[6];this.perpendicular=
|
|
467
|
+
a[7];this.read_only=a[8];this.media_changed=a[9];a[10]?(this.buffer||(this.buffer=new za(new ArrayBuffer(0))),this.buffer.set_state(a[10])):this.buffer=null};const Sc={[8]:"DEVICE RESET",[144]:"EXECUTE DEVICE DIAGNOSTIC",[231]:"FLUSH CACHE",[234]:"FLUSH CACHE EXT",[218]:"GET MEDIA STATUS",[236]:"IDENTIFY DEVICE",[161]:"IDENTIFY PACKET DEVICE",[225]:"IDLE IMMEDIATE",[145]:"INITIALIZE DEVICE PARAMETERS",[222]:"MEDIA LOCK",[0]:"NOP",[160]:"PACKET",[200]:"READ DMA",[37]:"READ DMA EXT",[41]:"READ MULTIPLE",
|
|
468
|
+
[196]:"READ MULTIPLE EXT",[248]:"READ NATIVE MAX ADDRESS",[39]:"READ NATIVE MAX ADDRESS EXT",[32]:"READ SECTORS",[36]:"READ SECTORS EXT",[64]:"READ VERIFY SECTORS",[245]:"SECURITY FREEZE LOCK",[239]:"SET FEATURES",[249]:"SET MAX",[198]:"SET MULTIPLE MODE",[224]:"STANDBY IMMEDIATE",[202]:"WRITE DMA",[53]:"WRITE DMA EXT",[57]:"WRITE MULTIPLE",[197]:"WRITE MULTIPLE EXT",[48]:"WRITE SECTORS",[52]:"WRITE SECTORS EXT",[16]:"<UNKNOWN 10h>",[240]:"<VENDOR-SPECIFIC F0h>"},Tc={[70]:{name:"GET CONFIGURATION",
|
|
469
|
+
flags:0},[74]:{name:"GET EVENT STATUS NOTIFICATION",flags:0},[18]:{name:"INQUIRY",flags:0},[189]:{name:"MECHANISM STATUS",flags:0},[26]:{name:"MODE SENSE (6)",flags:0},[90]:{name:"MODE SENSE (10)",flags:0},[69]:{name:"PAUSE",flags:1},[30]:{name:"PREVENT ALLOW MEDIUM REMOVAL",flags:0},[40]:{name:"READ",flags:1},[37]:{name:"READ CAPACITY",flags:1},[190]:{name:"READ CD",flags:1},[81]:{name:"READ DISK INFORMATION",flags:1},[66]:{name:"READ SUBCHANNEL",flags:1},[67]:{name:"READ TOC PMA ATIP",flags:1},
|
|
470
|
+
[82]:{name:"READ TRACK INFORMATION",flags:1},[3]:{name:"REQUEST SENSE",flags:0},[27]:{name:"START STOP UNIT",flags:0},[0]:{name:"TEST UNIT READY",flags:1}};function Uc(a,b,c){this.cpu=a;this.bus=b;this.secondary=this.primary=void 0;b=c&&c[0][0];const d=c&&c[1][0];if(b||d){b&&(this.primary=new Vc(this,0,c[0],496,1014,14));d&&(this.secondary=new Vc(this,1,c[1],368,886,15));c=b?this.primary.command_base:0;const e=b?this.primary.control_base:0,f=d?this.secondary.command_base:0,g=d?this.secondary.control_base:
|
|
471
|
+
0;this.name="ide";this.pci_id=240;this.pci_space=[134,128,16,112,5,0,160,2,0,128,1,1,0,0,0,0,c&255|1,c>>8,0,0,e&255|1,e>>8,0,0,f&255|1,f>>8,0,0,g&255|1,g>>8,0,0,1,180,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,0,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=[b?{size:8}:void 0,b?{size:1}:void 0,d?{size:8}:void 0,d?{size:1}:
|
|
472
|
+
void 0,{size:16}];a.devices.pci.register_device(this)}Object.seal(this)}Uc.prototype.get_state=function(){const a=[];a[0]=this.primary;a[1]=this.secondary;return a};Uc.prototype.set_state=function(a){this.primary&&this.primary.set_state(a[0]);this.secondary&&this.secondary.set_state(a[1])};function Vc(a,b,c,d,e,f){this.controller=a;this.channel_nr=b;this.cpu=a.cpu;this.bus=a.bus;this.command_base=d;this.control_base=e;this.irq=f;this.name="ide"+b;d=c?c[0]:void 0;c=c?c[1]:void 0;this.master=new X(this,
|
|
473
|
+
0,d?.buffer,d?.is_cdrom);this.slave=new X(this,1,c?.buffer,c?.is_cdrom);this.current_interface=this.master;this.device_control_reg=2;this.dma_command=this.dma_status=this.prdt_addr=0;a=a.cpu;a.io.register_read(this.command_base|0,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)});a.io.register_read(this.command_base|1,this,function(){return this.current_interface.error_reg&255});
|
|
474
|
+
a.io.register_read(this.command_base|2,this,function(){return this.current_interface.sector_count_reg&255});a.io.register_read(this.command_base|3,this,function(){return this.current_interface.lba_low_reg&255});a.io.register_read(this.command_base|4,this,function(){return this.current_interface.lba_mid_reg&255});a.io.register_read(this.command_base|5,this,function(){return this.current_interface.lba_high_reg&255});a.io.register_read(this.command_base|6,this,function(){return this.current_interface.device_reg&
|
|
475
|
+
255});a.io.register_read(this.command_base|7,this,function(){const g=this.read_status();this.cpu.device_lower_irq(this.irq);return g});a.io.register_write(this.command_base|0,this,function(g){this.current_interface.write_data_port8(g)},function(g){this.current_interface.write_data_port16(g)},function(g){this.current_interface.write_data_port32(g)});a.io.register_write(this.command_base|1,this,function(g){this.current_interface.features_reg=(this.current_interface.features_reg<<8|g)&65535});a.io.register_write(this.command_base|
|
|
476
|
+
2,this,function(g){this.current_interface.sector_count_reg=(this.current_interface.sector_count_reg<<8|g)&65535});a.io.register_write(this.command_base|3,this,function(g){this.current_interface.lba_low_reg=(this.current_interface.lba_low_reg<<8|g)&65535});a.io.register_write(this.command_base|4,this,function(g){this.current_interface.lba_mid_reg=(this.current_interface.lba_mid_reg<<8|g)&65535});a.io.register_write(this.command_base|5,this,function(g){this.current_interface.lba_high_reg=(this.current_interface.lba_high_reg<<
|
|
477
|
+
8|g)&65535});a.io.register_write(this.command_base|6,this,function(g){const k=g&16;if(k&&this.current_interface===this.master||!k&&this.current_interface===this.slave)k?(B(`${this.current_interface.name}: select slave device (${this.channel_nr?"secondary":"primary"})`,32768),this.current_interface=this.slave):(B(`${this.current_interface.name}: select master device (${this.channel_nr?"secondary":"primary"})`,32768),this.current_interface=this.master);this.current_interface.device_reg=g;this.current_interface.is_lba=
|
|
478
|
+
g>>6&1;this.current_interface.head=g&15});a.io.register_write(this.command_base|7,this,function(g){this.current_interface.status_reg&=-34;this.current_interface.ata_command(g);this.cpu.device_lower_irq(this.irq)});a.io.register_read(this.control_base|0,this,this.read_status);a.io.register_write(this.control_base|0,this,this.write_control);b=46080+8*b;a.io.register_read(b|0,this,this.dma_read_command8,void 0,this.dma_read_command);a.io.register_write(b|0,this,this.dma_write_command8,void 0,this.dma_write_command);
|
|
479
|
+
a.io.register_read(b|2,this,this.dma_read_status);a.io.register_write(b|2,this,this.dma_write_status);a.io.register_read(b|4,this,void 0,void 0,this.dma_read_addr);a.io.register_write(b|4,this,void 0,void 0,this.dma_set_addr);Object.seal(this)}Vc.prototype.read_status=function(){return this.current_interface.drive_connected?this.current_interface.status_reg:0};Vc.prototype.write_control=function(a){a&4&&(B(`${this.current_interface.name}: soft reset via control port (lower IRQ ${this.irq})`,32768),
|
|
480
|
+
this.cpu.device_lower_irq(this.irq),this.master.device_reset(),this.slave.device_reset());this.device_control_reg=a};Vc.prototype.dma_read_addr=function(){return this.prdt_addr};Vc.prototype.dma_set_addr=function(a){this.prdt_addr=a};Vc.prototype.dma_read_status=function(){return this.dma_status};Vc.prototype.dma_write_status=function(a){this.dma_status&=~(a&6)};Vc.prototype.dma_read_command=function(){return this.dma_read_command8()|this.dma_read_status()<<16};Vc.prototype.dma_read_command8=function(){return this.dma_command};
|
|
481
|
+
Vc.prototype.dma_write_command=function(a){this.dma_write_command8(a&255);this.dma_write_status(a>>16&255)};Vc.prototype.dma_write_command8=function(a){const b=this.dma_command;this.dma_command=a&9;if((b&1)!==(a&1))if(0===(a&1))this.dma_status&=-2;else switch(this.dma_status|=1,this.current_interface.current_command){case 200:case 37: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();
|
|
482
|
+
break;default:B(this.current_interface.name+": spurious DMA command write, current command: "+n(this.current_interface.current_command),32768),B(this.current_interface.name+": DMA clear status bit 1h, set status bit 2h",32768),this.dma_status&=-2,this.dma_status|=2,this.push_irq()}};Vc.prototype.push_irq=function(){0===(this.device_control_reg&2)&&(this.dma_status|=4,this.cpu.device_raise_irq(this.irq))};Vc.prototype.get_state=function(){var a=[];a[0]=this.master;a[1]=this.slave;a[2]=this.command_base;
|
|
483
|
+
a[3]=this.irq;a[5]=this.control_base;a[7]=this.name;a[8]=this.device_control_reg;a[9]=this.prdt_addr;a[10]=this.dma_status;a[11]=this.current_interface===this.master;a[12]=this.dma_command;return a};Vc.prototype.set_state=function(a){this.master.set_state(a[0]);this.slave.set_state(a[1]);this.command_base=a[2];this.irq=a[3];this.control_base=a[5];this.name=a[7];this.device_control_reg=a[8];this.prdt_addr=a[9];this.dma_status=a[10];this.current_interface=a[11]?this.master:this.slave;this.dma_command=
|
|
484
|
+
a[12]};function X(a,b,c,d){this.channel=a;this.name=a.name+"."+b;this.bus=a.bus;this.channel_nr=a.channel_nr;this.interface_nr=b;this.cpu=a.cpu;this.buffer=null;this.drive_connected=d||!!c;this.sector_size=d?2048:512;this.is_atapi=d;this.sector_count=0;this.head_count=this.is_atapi?1:0;this.device_reg=this.head=this.lba_high_reg=this.lba_mid_reg=this.features_reg=this.lba_low_reg=this.sector_count_reg=this.is_lba=this.cylinder_count=this.sectors_per_track=0;this.status_reg=80;this.sectors_per_drq=
|
|
485
|
+
128;this.data_pointer=this.error_reg=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_command=-1;this.last_io_id=this.write_dest=0;this.in_progress_io_ids=new Set;this.cancelled_io_ids=new Set;this.current_atapi_command=-1;this.atapi_add_sense=this.atapi_sense_key=0;this.medium_changed=!1;this.set_disk_buffer(c);this.drive_connected&&B(`${this.name}: ${this.is_atapi?"ATAPI CD-ROM":
|
|
486
|
+
"ATA HD"} device ready`,32768);Object.seal(this)}X.prototype.has_disk=function(){return!!this.buffer};X.prototype.eject=function(){this.is_atapi&&this.buffer&&(this.medium_changed=!0,this.buffer=null,this.status_reg=89,this.error_reg=96,this.push_irq())};X.prototype.set_cdrom=function(a){this.is_atapi&&a&&(this.set_disk_buffer(a),this.medium_changed=!0)};X.prototype.set_disk_buffer=function(a){if(a){this.buffer=a;this.is_atapi&&(this.status_reg=89,this.error_reg=96);this.sector_count=this.buffer.byteLength/
|
|
487
|
+
this.sector_size;this.sector_count!==(this.sector_count|0)&&(B(this.name+": warning: disk size not aligned with sector size",32768),this.sector_count=Math.ceil(this.sector_count));this.is_atapi?(this.head_count=1,this.sectors_per_track=2048):(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!==(this.cylinder_count|0)&&(B(this.name+": warning: rounding up cylinder count, choose different head number",32768),
|
|
488
|
+
this.cylinder_count=Math.floor(this.cylinder_count));if(0===this.interface_nr){a=this.cpu.devices.rtc;a.cmos_write(57,a.cmos_read(57)|1<<4*this.channel_nr);a.cmos_write(18,a.cmos_read(18)&15|240);const b=0===this.channel_nr?27:36;a.cmos_write(b+0,this.cylinder_count&255);a.cmos_write(b+1,this.cylinder_count>>8&255);a.cmos_write(b+2,this.head_count&255);a.cmos_write(b+3,255);a.cmos_write(b+4,255);a.cmos_write(b+5,200);a.cmos_write(b+6,this.cylinder_count&255);a.cmos_write(b+7,this.cylinder_count>>
|
|
489
|
+
8&255);a.cmos_write(b+8,this.sectors_per_track&255)}this.channel.cpu&&this.push_irq()}};X.prototype.device_reset=function(){this.is_atapi?(this.status_reg=0,this.lba_low_reg=this.error_reg=this.sector_count_reg=1,this.lba_mid_reg=20,this.lba_high_reg=235):(this.status_reg=81,this.lba_low_reg=this.error_reg=this.sector_count_reg=1,this.lba_high_reg=this.lba_mid_reg=0);this.cancel_io_operations()};X.prototype.push_irq=function(){this.channel.push_irq()};X.prototype.ata_abort_command=function(){this.error_reg=
|
|
490
|
+
4;this.status_reg=65;this.push_irq()};X.prototype.capture_regs=function(){return`ST=${n(this.status_reg&255)} ER=${n(this.error_reg&255)} `+`SC=${n(this.sector_count_reg&255)} LL=${n(this.lba_low_reg&255)} `+`LM=${n(this.lba_mid_reg&255)} LH=${n(this.lba_high_reg&255)} `+`FE=${n(this.features_reg&255)}`};X.prototype.ata_command=function(a){if(this.drive_connected||144===a){var b=this.capture_regs(),c=!0;this.current_command=a;this.error_reg=0;switch(a){case 8:this.data_length=this.data_end=this.data_pointer=
|
|
491
|
+
0;this.device_reset();this.push_irq();break;case 16:this.lba_mid_reg=0;this.status_reg=80;this.push_irq();break;case 248:var d=this.sector_count-1;this.lba_low_reg=d&255;this.lba_mid_reg=d>>8&255;this.lba_high_reg=d>>16&255;this.device_reg=this.device_reg&240|d>>24&15;this.status_reg=80;this.push_irq();break;case 39:d=this.sector_count-1;this.lba_low_reg=d&255;this.lba_mid_reg=d>>8&255;this.lba_high_reg=d>>16&255;this.lba_low_reg|=d>>24<<8&65280;this.status_reg=80;this.push_irq();break;case 32:c=
|
|
492
|
+
!1;this.is_atapi?(this.lba_mid_reg=20,this.lba_high_reg=235,this.ata_abort_command()):this.ata_read_sectors(a);break;case 36:case 41:case 196:c=!1;this.is_atapi?this.ata_abort_command():this.ata_read_sectors(a);break;case 48:case 52:case 57:case 197:c=!1;this.is_atapi?this.ata_abort_command():this.ata_write_sectors(a);break;case 144:this.channel.master.status_reg=80;this.channel.master.error_reg=1;this.channel.master.push_irq();this.channel.slave.drive_connected&&(this.channel.slave.status_reg=80,
|
|
493
|
+
this.channel.slave.error_reg=1,this.channel.slave.push_irq());break;case 145:this.status_reg=80;this.push_irq();break;case 160:this.is_atapi?(c=!1,this.data_allocate(12),this.data_end=12,this.sector_count_reg=1,this.status_reg=88,this.push_irq()):this.ata_abort_command();break;case 161:this.is_atapi?(this.create_identify_packet(),this.status_reg=88,this.push_irq()):this.ata_abort_command();break;case 198:B(this.name+": logical sectors per DRQ Block: "+n(this.sector_count_reg&255),32768);this.sectors_per_drq=
|
|
494
|
+
this.sector_count_reg&255;this.status_reg=80;this.push_irq();break;case 200:case 37:c=!1;this.ata_read_sectors_dma(a);break;case 202:case 53:c=!1;this.ata_write_sectors_dma(a);break;case 64:this.status_reg=80;this.push_irq();break;case 218:this.is_atapi&&(this.buffer||(this.error_reg|=2),this.medium_changed&&(this.error_reg|=32,this.medium_changed=!1),this.error_reg|=64);this.status_reg=80;this.push_irq();break;case 224:this.status_reg=80;this.push_irq();break;case 225:this.status_reg=80;this.push_irq();
|
|
495
|
+
break;case 231:this.status_reg=80;this.push_irq();break;case 234:this.status_reg=80;this.push_irq();break;case 236:this.is_atapi?(this.lba_mid_reg=20,this.lba_high_reg=235,this.ata_abort_command()):(this.create_identify_packet(),this.status_reg=88,this.push_irq());break;case 239:this.status_reg=80;this.push_irq();break;case 222:this.status_reg=64;this.push_irq();break;case 245:this.status_reg=80;this.push_irq();break;case 249:this.ata_abort_command();break;case 0:this.ata_abort_command();break;case 240:B(`${this.name}: error: unimplemented vendor-specific ATA command ${n(a)}: ABORT [${this.capture_regs()}]`,
|
|
496
|
+
32768);this.ata_abort_command();break;default:l(!1,`${this.name}: error: unimplemented ATA command ${n(a)}: ABORT [${this.capture_regs()}]`,32768),this.ata_abort_command()}c&&(b=`[${b}] -> [${this.capture_regs()}]`,c=this.status_reg&1?this.error_reg&4?"ABORT":"ERROR":"OK",B(`${this.name}: ATA command ${Sc[a]} (${n(a)}): ${c} ${b}`,32768))}else B(`${this.name}: ATA command ${Sc[a]} (${n(a)}) ignored: no slave drive connected`,32768)};X.prototype.atapi_handle=function(){const a=this.data[0],b=Tc[a]?
|
|
497
|
+
Tc[a].name:"<undefined>";var c=Tc[a]?Tc[a].flags:0,d=this.capture_regs(),e=!0;let f;this.data_pointer=0;this.current_atapi_command=a;3!==a&&(this.atapi_add_sense=this.atapi_sense_key=0);if(!this.buffer&&c&1)this.atapi_check_condition_response(2,58),this.push_irq(),B(`${this.name}: ATAPI command ${b} (${n(a)}) without medium: ERROR [${d}]`,32768);else{switch(a){case 0:this.buffer?(this.data_allocate(0),this.data_end=this.data_length,this.status_reg=80):this.atapi_check_condition_response(2,58);break;
|
|
498
|
+
case 3:this.data_allocate(this.data[4]);this.data_end=this.data_length;this.status_reg=88;this.data[0]=240;this.data[2]=this.atapi_sense_key;this.data[7]=8;this.data[12]=this.atapi_add_sense;this.atapi_add_sense=this.atapi_sense_key=0;break;case 18:c=this.data[4];this.status_reg=88;f="lun="+n(this.data[1],2)+" length="+c;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,c);break;case 26:this.data_allocate(this.data[4]);
|
|
499
|
+
this.data_end=this.data_length;this.status_reg=88;break;case 30:this.data_allocate(0);this.data_end=this.data_length;this.status_reg=80;break;case 37:c=this.sector_count-1;this.data_set(new Uint8Array([c>>24&255,c>>16&255,c>>8&255,c&255,0,0,this.sector_size>>8&255,this.sector_size&255]));this.data_end=this.data_length;this.status_reg=88;break;case 40:e=!1;this.features_reg&1?this.atapi_read_dma(this.data):this.atapi_read(this.data);break;case 66:c=this.data[8];f="length="+c;this.data_allocate(Math.min(8,
|
|
500
|
+
c));this.data_end=this.data_length;this.status_reg=88;break;case 67:c=this.data[8]|this.data[7]<<8;var g=this.data[9]>>6;f=`${n(g,2)} length=${c} ${!!(this.data[1]&2)} ${n(this.data[6])}`;this.data_allocate(c);this.data_end=this.data_length;0===g?(c=this.sector_count,this.data.set(new Uint8Array([0,18,1,1,0,20,1,0,0,0,0,0,0,22,170,0,c>>24,c>>16&255,c>>8&255,c&255]))):1===g?this.data.set(new Uint8Array([0,10,1,1,0,0,0,0,0,0,0,0])):l(!1,this.name+": error: unimplemented format: "+g);this.status_reg=
|
|
501
|
+
88;break;case 70:c=Math.min(this.data[8]|this.data[7]<<8,32);f="length="+c;this.data_allocate(c);this.data_end=this.data_length;this.data[0]=c-4>>24&255;this.data[1]=c-4>>16&255;this.data[2]=c-4>>8&255;this.data[3]=c-4&255;this.data[6]=8;this.data[10]=3;this.status_reg=88;break;case 81:this.data_allocate(0);this.data_end=this.data_length;this.status_reg=80;break;case 82:f="unimplemented";this.atapi_check_condition_response(5,36);break;case 90:c=this.data[8]|this.data[7]<<8;g=this.data[2];f="page_code="+
|
|
502
|
+
n(g)+" length="+c;42===g&&this.data_allocate(Math.min(30,c));this.data_end=this.data_length;this.status_reg=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_reg=88;break;case 27:c=this.data[4]&3;f=`Immed=${n(this.data[1]&1)} LoEj/Start=${n(c)}`;this.buffer&&2===c&&(f+=": disk ejected",this.medium_changed=!0,this.buffer=null);this.status_reg=80;this.data_allocate(0);this.data_end=this.data_length;break;case 69:case 74:f="unimplemented";
|
|
503
|
+
this.atapi_check_condition_response(5,36);break;case 190:f="unimplemented";this.data_allocate(0);this.data_end=this.data_length;this.status_reg=80;break;default:l(!1,`${this.name}: error: unimplemented ATAPI command ${n(this.data[0])}`,32768),this.atapi_check_condition_response(5,36)}this.sector_count_reg=this.sector_count_reg&-8|2;0===(this.status_reg&128)&&this.push_irq();0===(this.status_reg&128)&&0===this.data_length&&(this.sector_count_reg|=1,this.status_reg&=-9);e&&(d=`[${d}] -> [${this.capture_regs()}]`,
|
|
504
|
+
e=this.status_reg&1?this.error_reg&4?"ABORT":"ERROR":"OK",f=f?` ${f}:`:"",B(`${this.name}: ATAPI command ${b} (${n(a)}):${f} ${e} ${d}`,32768))}};X.prototype.atapi_check_condition_response=function(a,b){this.data_allocate(0);this.data_end=this.data_length;this.status_reg=65;this.error_reg=a<<4;this.sector_count_reg=this.sector_count_reg&-8|3;this.atapi_sense_key=a;this.atapi_add_sense=b};X.prototype.do_write=function(){this.status_reg=80;l(this.data_length<=this.data.length);var a=this.data.subarray(0,
|
|
505
|
+
this.data_length);l(0===this.data_length%512);this.ata_advance(this.current_command,this.data_length/512);this.push_irq();this.buffer.set(this.write_dest,a,function(){});this.report_write(this.data_length)};X.prototype.atapi_read=function(a){var b=(a[7]<<8|a[8])*this.sector_size;a=(a[2]<<24|a[3]<<16|a[4]<<8|a[5])*this.sector_size;this.data_length=0;var c=this.lba_high_reg<<8&65280|this.lba_mid_reg&255;this.lba_mid_reg=this.lba_high_reg=0;65535===c&&c--;c>b&&(c=b);this.buffer?a>=this.buffer.byteLength?
|
|
506
|
+
(l(!1,this.name+": CD read: Outside of disk end="+n(a+b)+" size="+n(this.buffer.byteLength),32768),this.status_reg=255,this.push_irq()):0===b?(this.status_reg=80,this.data_pointer=0):(b=Math.min(b,this.buffer.byteLength-a),this.status_reg=208,this.report_read_start(),this.read_buffer(a,b,d=>{this.data_set(d);this.status_reg=88;this.sector_count_reg=this.sector_count_reg&-8|2;this.push_irq();this.data_end=c&=-4;this.data_end>this.data_length&&(this.data_end=this.data_length);this.lba_mid_reg=this.data_end&
|
|
507
|
+
255;this.lba_high_reg=this.data_end>>8&255;this.report_read_end(b)})):(l(!1,this.name+": CD read: no buffer",32768),this.status_reg=255,this.error_reg=65,this.push_irq())};X.prototype.atapi_read_dma=function(a){var b=a[2]<<24|a[3]<<16|a[4]<<8|a[5],c=a[7]<<8|a[8];a=a[1];var d=c*this.sector_size,e=b*this.sector_size;B(this.name+": CD read DMA lba="+n(b)+" lbacount="+n(c)+" bytecount="+n(d)+" flags="+n(a),32768);e>=this.buffer.byteLength?(l(!1,this.name+": CD read: Outside of disk end="+n(e+d)+" size="+
|
|
530
508
|
n(this.buffer.byteLength),32768),this.status_reg=255,this.push_irq()):(this.status_reg=208,this.report_read_start(),this.read_buffer(e,d,f=>{B(this.name+": atapi_read_dma: Data arrived",32768);this.report_read_end(d);this.status_reg=88;this.sector_count_reg=this.sector_count_reg&-8|2;this.data_set(f);this.do_atapi_dma()}))};X.prototype.do_atapi_dma=function(){if(0===(this.channel.dma_status&1))B(this.name+": do_atapi_dma: Status not set",32768);else if(0===(this.status_reg&8))B(this.name+": do_atapi_dma: DRQ not set",
|
|
531
|
-
32768);else{var a=this.channel.prdt_addr,b=0,c=this.data;do{var d=this.cpu.read32s(a),e=this.cpu.read16(a+4),f=this.cpu.read8(a+7)&128;e||(e=65536);this.cpu.write_blob(c.subarray(b,Math.min(b+e,this.data_length)),d);b+=e;a+=8;if(b>=this.data_length&&!f)break}while(!f);this.status_reg=80;this.channel.dma_status&=-2;this.sector_count_reg=this.sector_count_reg&-8|3;this.push_irq()}};X.prototype.read_data=function(a){if(this.data_pointer<this.data_end){
|
|
509
|
+
32768);else{var a=this.channel.prdt_addr,b=0,c=this.data;do{var d=this.cpu.read32s(a),e=this.cpu.read16(a+4),f=this.cpu.read8(a+7)&128;e||(e=65536);this.cpu.write_blob(c.subarray(b,Math.min(b+e,this.data_length)),d);b+=e;a+=8;if(b>=this.data_length&&!f)break}while(!f);this.status_reg=80;this.channel.dma_status&=-2;this.sector_count_reg=this.sector_count_reg&-8|3;this.push_irq()}};X.prototype.read_data=function(a){if(this.data_pointer<this.data_end){l(this.data_pointer+a-1<this.data_end);l(0===this.data_pointer%
|
|
532
510
|
a,n(this.data_pointer)+" "+a);var b=1===a?this.data[this.data_pointer]:2===a?this.data16[this.data_pointer>>>1]:this.data32[this.data_pointer>>>2];this.data_pointer+=a;this.data_pointer>=this.data_end&&this.read_end();return b}this.data_pointer+=a;return 0};X.prototype.read_end=function(){if(160===this.current_command)if(this.data_end===this.data_length)this.status_reg=80,this.sector_count_reg=this.sector_count_reg&-8|3,this.push_irq();else{this.status_reg=88;this.sector_count_reg=this.sector_count_reg&
|
|
533
|
-
-8|2;this.push_irq();var a=this.lba_high_reg<<8&65280|this.lba_mid_reg&255;this.data_end+a>this.data_length?(this.lba_mid_reg=this.data_length-this.data_end&255,this.lba_high_reg=this.data_length-this.data_end>>8&255,this.data_end=this.data_length):this.data_end+=a}else this.error_reg=0,this.data_pointer>=this.data_length?this.status_reg=80:(41===this.current_command||196===this.current_command?(a=Math.min(this.sectors_per_drq,(this.data_length-this.data_end)/512),
|
|
534
|
-
36===this.current_command),a=1),this.ata_advance(this.current_command,a),this.data_end+=512*a,this.status_reg=88,this.push_irq())};X.prototype.write_data_port=function(a,b){
|
|
535
|
-
4),
|
|
511
|
+
-8|2;this.push_irq();var a=this.lba_high_reg<<8&65280|this.lba_mid_reg&255;this.data_end+a>this.data_length?(this.lba_mid_reg=this.data_length-this.data_end&255,this.lba_high_reg=this.data_length-this.data_end>>8&255,this.data_end=this.data_length):this.data_end+=a}else this.error_reg=0,this.data_pointer>=this.data_length?this.status_reg=80:(41===this.current_command||196===this.current_command?(a=Math.min(this.sectors_per_drq,(this.data_length-this.data_end)/512),l(0===a%1)):(l(32===this.current_command||
|
|
512
|
+
36===this.current_command),a=1),this.ata_advance(this.current_command,a),this.data_end+=512*a,this.status_reg=88,this.push_irq())};X.prototype.write_data_port=function(a,b){l(0===this.data_pointer%b);this.data_pointer>=this.data_end?B(this.name+": redundant write to data port: "+n(a)+" count="+n(this.data_end)+" cur="+n(this.data_pointer),32768):(1===b?this.data[this.data_pointer++]=a:2===b?(this.data16[this.data_pointer>>>1]=a,this.data_pointer+=2):(this.data32[this.data_pointer>>>2]=a,this.data_pointer+=
|
|
513
|
+
4),l(this.data_pointer<=this.data_end),this.data_pointer===this.data_end&&this.write_end())};X.prototype.write_data_port8=function(a){this.write_data_port(a,1)};X.prototype.write_data_port16=function(a){this.write_data_port(a,2)};X.prototype.write_data_port32=function(a){this.write_data_port(a,4)};X.prototype.write_end=function(){160===this.current_command?this.atapi_handle():this.data_pointer>=this.data_length?this.do_write():(l(48===this.current_command||52===this.current_command||197===this.current_command,
|
|
536
514
|
"Unexpected command: "+n(this.current_command)),this.status_reg=88,this.data_end+=512,this.push_irq())};X.prototype.ata_advance=function(a,b){this.sector_count_reg-=b;36===a||41===a||37===a||52===a||57===a||53===a?(a=b+this.get_lba48(),this.lba_low_reg=a&255|a>>16&65280,this.lba_mid_reg=a>>8&255,this.lba_high_reg=a>>16&255):this.is_lba?(a=b+this.get_lba28(),this.lba_low_reg=a&255,this.lba_mid_reg=a>>8&255,this.lba_high_reg=a>>16&255,this.head=this.head&-16|a&15):(a=b+this.get_chs(),b=a/(this.head_count*
|
|
537
|
-
this.sectors_per_track)|0,this.lba_mid_reg=b&255,this.lba_high_reg=b>>8&255,this.head=(a/this.sectors_per_track|0)%this.head_count&15,this.lba_low_reg=a%this.sectors_per_track+1&255,
|
|
538
|
-
192,this.report_read_start(),this.read_buffer(b,e,f=>{this.data_set(f);this.status_reg=88;this.data_end=d?512:Math.min(e,512*this.sectors_per_drq);this.ata_advance(a,d?1:Math.min(c,this.sectors_per_track));this.push_irq();this.report_read_end(e)}))};X.prototype.ata_read_sectors_dma=function(a){a=37===a;var b=this.get_count(a);this.get_lba(a)*this.sector_size+b*this.sector_size>this.buffer.byteLength?(
|
|
539
|
-
88,this.channel.dma_status|=1)};X.prototype.do_ata_read_sectors_dma=function(){var a=37===this.current_command,b=this.get_count(a);a=this.get_lba(a);var c=b*this.sector_size,d=a*this.sector_size;
|
|
540
|
-
c);this.ata_advance(this.current_command,b);this.status_reg=80;this.channel.dma_status&=-2;this.current_command=-1;this.report_read_end(c);this.push_irq()})};X.prototype.ata_write_sectors=function(a){var b=52===a||57===a,c=this.get_count(b);b=this.get_lba(b);a=48===a||52===a;c*=this.sector_size;b*=this.sector_size;b+c>this.buffer.byteLength?(
|
|
541
|
-
Math.min(c,512*this.sectors_per_drq),this.write_dest=b)};X.prototype.ata_write_sectors_dma=function(a){a=53===a;var b=this.get_count(a);this.get_lba(a)*this.sector_size+b*this.sector_size>this.buffer.byteLength?(
|
|
542
|
-
var d=this.channel.prdt_addr,e=0;const f=new Uint8Array(a);do{var
|
|
515
|
+
this.sectors_per_track)|0,this.lba_mid_reg=b&255,this.lba_high_reg=b>>8&255,this.head=(a/this.sectors_per_track|0)%this.head_count&15,this.lba_low_reg=a%this.sectors_per_track+1&255,l(a===this.get_chs()))};X.prototype.ata_read_sectors=function(a){var b=36===a||41===a,c=this.get_count(b);b=this.get_lba(b);var d=32===a||36===a,e=c*this.sector_size;b*=this.sector_size;b+e>this.buffer.byteLength?(l(!1,this.name+": ATA read: Outside of disk",32768),this.status_reg=255,this.push_irq()):(this.status_reg=
|
|
516
|
+
192,this.report_read_start(),this.read_buffer(b,e,f=>{this.data_set(f);this.status_reg=88;this.data_end=d?512:Math.min(e,512*this.sectors_per_drq);this.ata_advance(a,d?1:Math.min(c,this.sectors_per_track));this.push_irq();this.report_read_end(e)}))};X.prototype.ata_read_sectors_dma=function(a){a=37===a;var b=this.get_count(a);this.get_lba(a)*this.sector_size+b*this.sector_size>this.buffer.byteLength?(l(!1,this.name+": ATA read: Outside of disk",32768),this.status_reg=255,this.push_irq()):(this.status_reg=
|
|
517
|
+
88,this.channel.dma_status|=1)};X.prototype.do_ata_read_sectors_dma=function(){var a=37===this.current_command,b=this.get_count(a);a=this.get_lba(a);var c=b*this.sector_size,d=a*this.sector_size;l(a<this.buffer.byteLength);this.report_read_start();var e=this.channel.prdt_addr;this.read_buffer(d,c,f=>{var g=this.channel.prdt_addr,k=0;l(e===g);do{var m=this.cpu.read32s(g),p=this.cpu.read16(g+4),q=this.cpu.read8(g+7)&128;p||(p=65536);this.cpu.write_blob(f.subarray(k,k+p),m);k+=p;g+=8}while(!q);l(k===
|
|
518
|
+
c);this.ata_advance(this.current_command,b);this.status_reg=80;this.channel.dma_status&=-2;this.current_command=-1;this.report_read_end(c);this.push_irq()})};X.prototype.ata_write_sectors=function(a){var b=52===a||57===a,c=this.get_count(b);b=this.get_lba(b);a=48===a||52===a;c*=this.sector_size;b*=this.sector_size;b+c>this.buffer.byteLength?(l(!1,this.name+": ATA write: Outside of disk",32768),this.status_reg=255,this.push_irq()):(this.status_reg=88,this.data_allocate_noclear(c),this.data_end=a?512:
|
|
519
|
+
Math.min(c,512*this.sectors_per_drq),this.write_dest=b)};X.prototype.ata_write_sectors_dma=function(a){a=53===a;var b=this.get_count(a);this.get_lba(a)*this.sector_size+b*this.sector_size>this.buffer.byteLength?(l(!1,this.name+": ATA DMA write: Outside of disk",32768),this.status_reg=255,this.push_irq()):(this.status_reg=88,this.channel.dma_status|=1)};X.prototype.do_ata_write_sectors_dma=function(){var a=53===this.current_command,b=this.get_count(a),c=this.get_lba(a);a=b*this.sector_size;c*=this.sector_size;
|
|
520
|
+
var d=this.channel.prdt_addr,e=0;const f=new Uint8Array(a);do{var g=this.cpu.read32s(d),k=this.cpu.read16(d+4),m=this.cpu.read8(d+7)&128;k||(k=65536,B(this.name+": DMA: prd count was 0",32768));g=this.cpu.mem8.subarray(g,g+k);l(g.length===k);f.set(g,e);e+=k;d+=8}while(!m);l(e===f.length);this.buffer.set(c,f,()=>{this.ata_advance(this.current_command,b);this.status_reg=80;this.push_irq();this.channel.dma_status&=-2;this.current_command=-1});this.report_write(a)};X.prototype.get_chs=function(){return((this.lba_mid_reg&
|
|
543
521
|
255|this.lba_high_reg<<8&65280)*this.head_count+this.head)*this.sectors_per_track+(this.lba_low_reg&255)-1};X.prototype.get_lba28=function(){return this.lba_low_reg&255|this.lba_mid_reg<<8&65280|this.lba_high_reg<<16&16711680|(this.head&15)<<24};X.prototype.get_lba48=function(){return(this.lba_low_reg&255|this.lba_mid_reg<<8&65280|this.lba_high_reg<<16&16711680|this.lba_low_reg>>8<<24&4278190080)>>>0};X.prototype.get_lba=function(a){return a?this.get_lba48():this.is_lba?this.get_lba28():this.get_chs()};
|
|
544
|
-
X.prototype.get_count=function(a){a?(a=this.sector_count_reg,0===a&&(a=65536)):(a=this.sector_count_reg&255,0===a&&(a=256));return a};X.prototype.create_identify_packet=function(){const a=Math.min(16383,this.cylinder_count),b=(
|
|
522
|
+
X.prototype.get_count=function(a){a?(a=this.sector_count_reg,0===a&&(a=65536)):(a=this.sector_count_reg&255,0===a&&(a=256));return a};X.prototype.create_identify_packet=function(){const a=Math.min(16383,this.cylinder_count),b=(g,k,m,p)=>{k<<=1;var q=m<<1;m=k+q;g.fill(32,k,q);for(q=0;q<p.length&&k<m;q++)q&1?(g[k]=p.charCodeAt(q),k+=2):g[k+1]=p.charCodeAt(q)},c=this.is_atapi?34112:64,d=160===this.current_command?0:1031,e=this.is_atapi?16928:16384,f=this.is_atapi?20480:29696;this.data.fill(0,0,512);
|
|
545
523
|
this.data_set([c&255,c>>8&255,a&255,a>>8&255,0,0,this.head_count&255,this.head_count>>8&255,this.sectors_per_track/512&255,this.sectors_per_track/512>>8&255,0,2,this.sectors_per_track&255,this.sectors_per_track>>8&255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,1,0,0,2,0,0,0,2,0,2,7,0,a&255,a>>8&255,this.head_count&255,this.head_count>>8&255,this.sectors_per_track,0,this.sector_count&
|
|
546
524
|
255,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255,0,0,this.sector_count&255,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255,0,0,d&255,d>>8&255,0,0,30,0,30,0,30,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,e&255,e>>8&255,f&255,f>>8&255,0,64,e&255,e>>8&255,f&255,f>>8&255,0,64,0,0,0,0,0,0,0,0,0,0,1,96,0,0,0,0,0,0,0,0,0,0,0,0,this.sector_count&255,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255]);b(this.data,
|
|
547
525
|
10,10,`8086-86${this.channel_nr}${this.interface_nr}`);b(this.data,23,4,"1.00");b(this.data,27,20,this.is_atapi?"v86 ATAPI CD-ROM":"v86 ATA HD");this.data_end=this.data_length=512};X.prototype.data_allocate=function(a){this.data_allocate_noclear(a);this.data32.fill(0,0,a+3>>2)};X.prototype.data_allocate_noclear=function(a){this.data.length<a&&(this.data=new Uint8Array(a+3&-4),this.data16=new Uint16Array(this.data.buffer),this.data32=new Int32Array(this.data.buffer));this.data_length=a;this.data_pointer=
|
|
548
526
|
0};X.prototype.data_set=function(a){this.data_allocate_noclear(a.length);this.data.set(a)};X.prototype.report_read_start=function(){this.bus.send("ide-read-start")};X.prototype.report_read_end=function(a){this.bus.send("ide-read-end",[this.channel_nr,a,a/this.sector_size|0])};X.prototype.report_write=function(a){this.bus.send("ide-write-end",[this.channel_nr,a,a/this.sector_size|0])};X.prototype.read_buffer=function(a,b,c){const d=this.last_io_id++;this.in_progress_io_ids.add(d);this.buffer.get(a,
|
|
549
|
-
b,e=>{if(this.cancelled_io_ids.delete(d))
|
|
527
|
+
b,e=>{if(this.cancelled_io_ids.delete(d))l(!this.in_progress_io_ids.has(d));else{var f=this.in_progress_io_ids.delete(d);l(f);c(e)}})};X.prototype.cancel_io_operations=function(){for(const a of this.in_progress_io_ids)this.cancelled_io_ids.add(a);this.in_progress_io_ids.clear()};X.prototype.get_state=function(){var a=[];a[0]=this.sector_count_reg;a[1]=this.cylinder_count;a[2]=this.lba_high_reg;a[3]=this.lba_mid_reg;a[4]=this.data_pointer;a[5]=0;a[6]=0;a[7]=0;a[8]=0;a[9]=this.device_reg;a[10]=this.error_reg;
|
|
550
528
|
a[11]=this.head;a[12]=this.head_count;a[13]=this.is_atapi;a[14]=this.is_lba;a[15]=this.features_reg;a[16]=this.data;a[17]=this.data_length;a[18]=this.lba_low_reg;a[19]=this.sector_count;a[20]=this.sector_size;a[21]=this.sectors_per_drq;a[22]=this.sectors_per_track;a[23]=this.status_reg;a[24]=this.write_dest;a[25]=this.current_command;a[26]=this.data_end;a[27]=this.current_atapi_command;a[28]=this.buffer;return a};X.prototype.set_state=function(a){this.sector_count_reg=a[0];this.cylinder_count=a[1];
|
|
551
529
|
this.lba_high_reg=a[2];this.lba_mid_reg=a[3];this.data_pointer=a[4];this.device_reg=a[9];this.error_reg=a[10];this.head=a[11];this.head_count=a[12];this.is_atapi=a[13];this.is_lba=a[14];this.features_reg=a[15];this.data=a[16];this.data_length=a[17];this.lba_low_reg=a[18];this.sector_count=a[19];this.sector_size=a[20];this.sectors_per_drq=a[21];this.sectors_per_track=a[22];this.status_reg=a[23];this.write_dest=a[24];this.current_command=a[25];this.data_end=a[26];this.current_atapi_command=a[27];this.data16=
|
|
552
|
-
new Uint16Array(this.data.buffer);this.data32=new Int32Array(this.data.buffer);this.buffer&&this.buffer.set_state(a[28]);this.drive_connected=this.is_atapi||this.buffer;this.medium_changed=!1};function
|
|
553
|
-
notify_offset:0}),b.push({size_supported:1024,notify_offset:1});b.push({size_supported:16,notify_offset:2});this.virtio=new
|
|
554
|
-
this.id+"-send",
|
|
555
|
-
this.Send(d,
|
|
530
|
+
new Uint16Array(this.data.buffer);this.data32=new Int32Array(this.data.buffer);this.buffer&&this.buffer.set_state(a[28]);this.drive_connected=this.is_atapi||this.buffer;this.medium_changed=!1};function Wc(a,b,c){this.bus=b;this.id=a.devices.net?1:0;this.status=this.pairs=1;this.preserve_mac_from_state_image=c;this.mac=new Uint8Array([0,34,21,255*Math.random()|0,255*Math.random()|0,255*Math.random()|0]);this.bus.send("net"+this.id+"-mac",Bc(this.mac));b=[];for(c=0;c<this.pairs;++c)b.push({size_supported:1024,
|
|
531
|
+
notify_offset:0}),b.push({size_supported:1024,notify_offset:1});b.push({size_supported:16,notify_offset:2});this.virtio=new Ec(a,{name:"virtio-net",pci_id:80,device_id:4161,subsystem_device_id:1,common:{initial_port:51200,queues:b,features:[5,16,22,3,17,23,32],on_driver_ok:()=>{}},notification:{initial_port:51456,single_handler:!1,handlers:[()=>{},d=>{const e=this.virtio.queues[d];for(;e.has_request();){const f=e.pop_request(),g=new Uint8Array(f.length_readable);f.get_next_blob(g);this.bus.send("net"+
|
|
532
|
+
this.id+"-send",g.subarray(12));this.bus.send("eth-transmit-end",[g.length-12]);this.virtio.queues[d].push_reply(f)}this.virtio.queues[d].flush_replies()},d=>{if(d!==2*this.pairs)l(!1,"VirtioNet Notified for wrong queue: "+d+" (expected queue_id of 3)");else for(var e=this.virtio.queues[d];e.has_request();){const k=e.pop_request();var f=new Uint8Array(k.length_readable);k.get_next_blob(f);var g=K(["b","b"],f,{offset:0});const m=g[0];g=g[1];switch(m<<8|g){case 1024:f=K(["h"],f,{offset:2});l(1===f[0]);
|
|
533
|
+
this.Send(d,k,new Uint8Array([0]));break;case 257:this.mac=f.subarray(2,8);this.Send(d,k,new Uint8Array([0]));this.bus.send("net"+this.id+"-mac",Bc(this.mac));break;default:l(!1," VirtioNet received unknown command: "+m+":"+g);this.Send(d,k,new Uint8Array([1]));return}}}]},isr_status:{initial_port:50944},device_specific:{initial_port:50688,struct:[0,1,2,3,4,5].map((d,e)=>({bytes:1,name:"mac_"+e,read:()=>this.mac[e],write:()=>{}})).concat([{bytes:2,name:"status",read:()=>this.status,write:()=>{}},
|
|
556
534
|
{bytes:2,name:"max_pairs",read:()=>this.pairs,write:()=>{}},{bytes:2,name:"mtu",read:()=>1500,write:()=>{}}])}});this.bus.register("net"+this.id+"-receive",d=>{this.bus.send("eth-receive-end",[d.length]);const e=new Uint8Array(12+d.byteLength);(new DataView(e.buffer,e.byteOffset,e.byteLength)).setInt16(10,1);e.set(d,12);d=this.virtio.queues[0];d.has_request()?(d=d.pop_request(),d.set_next_blob(e),this.virtio.queues[0].push_reply(d),this.virtio.queues[0].flush_replies()):console.log("No buffer to write into!")},
|
|
557
|
-
this)}
|
|
558
|
-
this.virtio.queues[a].flush_replies()};const
|
|
535
|
+
this)}Wc.prototype.get_state=function(){const a=[];a[0]=this.virtio;a[1]=this.id;a[2]=this.mac;return a};Wc.prototype.set_state=function(a){this.virtio.set_state(a[0]);this.id=a[1];this.preserve_mac_from_state_image&&(this.mac=a[2],this.bus.send("net"+this.id+"-mac",Bc(this.mac)))};Wc.prototype.reset=function(){this.virtio.reset()};Wc.prototype.Send=function(a,b,c){b.set_next_blob(c);this.virtio.queues[a].push_reply(b);this.virtio.queues[a].flush_replies()};Wc.prototype.Ack=function(a,b){this.virtio.queues[a].push_reply(b);
|
|
536
|
+
this.virtio.queues[a].flush_replies()};const Xc=Uint32Array.from([655360,655360,720896,753664]),Yc=Uint32Array.from([131072,65536,32768,32768]);function Y(a,b,c,d){this.cpu=a;this.bus=b;this.screen=c;this.vga_memory_size=d;this.cursor_address=0;this.cursor_scanline_start=14;this.cursor_scanline_end=15;this.max_cols=80;this.max_rows=25;this.virtual_height=this.virtual_width=this.screen_height=this.screen_width=0;this.layers=[];this.start_address_latched=this.start_address=0;this.crtc=new Uint8Array(25);
|
|
559
537
|
this.line_compare=this.offset_register=this.preset_row_scan=this.underline_location_register=this.vertical_blank_start=this.vertical_display_enable_end=this.horizontal_blank_start=this.horizontal_display_enable_end=this.crtc_mode=0;this.graphical_mode=!1;this.vga256_palette=new Int32Array(256);this.latch_dword=0;this.svga_version=45253;this.svga_height=this.svga_width=0;this.svga_enabled=!1;this.svga_bpp=32;this.svga_offset_y=this.svga_offset_x=this.svga_offset=this.svga_bank_offset=0;this.vga_memory_size=
|
|
560
|
-
void 0===this.vga_memory_size||262144>this.vga_memory_size?262144:268435456<this.vga_memory_size?268435456:
|
|
538
|
+
void 0===this.vga_memory_size||262144>this.vga_memory_size?262144:268435456<this.vga_memory_size?268435456:ma(this.vga_memory_size);B("effective vga memory size: "+this.vga_memory_size,256);this.pci_space=[52,18,17,17,3,1,0,0,0,0,0,3,0,0,0,0,8,14680064,57344,224,0,0,0,0,0,0,191,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,26,0,17,0,0,190,254,0,0,0,0,0,0,0,0,0,0,0,0];this.pci_id=144;this.pci_bars=[{size:this.vga_memory_size}];this.pci_rom_size=65536;this.pci_rom_address=4272947200;this.name="vga";this.dac_state=
|
|
561
539
|
this.dac_color_index_read=this.dac_color_index_write=this.index_crtc=0;this.dac_mask=255;this.dac_map=new Uint8Array(16);this.attribute_controller_index=-1;this.palette_source=32;this.color_select=this.horizontal_panning=this.color_plane_enable=this.attribute_mode=0;this.sequencer_index=-1;this.plane_write_bm=15;this.clocking_mode=this.sequencer_memory_mode=0;this.graphics_index=-1;this.planar_rotate_reg=this.planar_mode=this.plane_read=this.character_map_select=0;this.planar_bitmap=255;this.max_scan_line=
|
|
562
540
|
this.color_dont_care=this.color_compare=this.miscellaneous_graphics_register=this.planar_setreset_enable=this.planar_setreset=0;this.port_3DA_value=this.miscellaneous_output_register=255;this.font_page_ab_enabled=!1;b=a.io;b.register_write(960,this,this.port3C0_write);b.register_read(960,this,this.port3C0_read,this.port3C0_read16);b.register_read(961,this,this.port3C1_read);b.register_write(962,this,this.port3C2_write);b.register_write_consecutive(964,this,this.port3C4_write,this.port3C5_write);b.register_read(964,
|
|
563
541
|
this,this.port3C4_read);b.register_read(965,this,this.port3C5_read);b.register_write_consecutive(974,this,this.port3CE_write,this.port3CF_write);b.register_read(974,this,this.port3CE_read);b.register_read(975,this,this.port3CF_read);b.register_read(966,this,this.port3C6_read);b.register_write(966,this,this.port3C6_write);b.register_write(967,this,this.port3C7_write);b.register_read(967,this,this.port3C7_read);b.register_write(968,this,this.port3C8_write);b.register_read(968,this,this.port3C8_read);
|
|
564
542
|
b.register_write(969,this,this.port3C9_write);b.register_read(969,this,this.port3C9_read);b.register_read(972,this,this.port3CC_read);b.register_write(980,this,this.port3D4_write,this.port3D4_write16);b.register_write(981,this,this.port3D5_write,this.port3D5_write16);b.register_read(980,this,this.port3D4_read);b.register_read(981,this,this.port3D5_read,this.port3D5_read16);b.register_write(948,this,this.port3D4_write,this.port3D4_write16);b.register_write(949,this,this.port3D5_write,this.port3D5_write16);
|
|
565
543
|
b.register_read(948,this,this.port3D4_read);b.register_read(949,this,this.port3D5_read,this.port3D5_read16);b.register_read(970,this,function(){B("3CA read",256);return 0});b.register_read(986,this,this.port3DA_read);b.register_read(954,this,this.port3DA_read);this.dispi_index=-1;this.dispi_enable_value=0;b.register_write(462,this,void 0,this.port1CE_write);b.register_write(463,this,void 0,this.port1CF_write);b.register_read(463,this,void 0,this.port1CF_read);c=a.svga_allocate_memory(this.vga_memory_size)>>>
|
|
566
|
-
0;this.svga_memory=
|
|
544
|
+
0;this.svga_memory=h(Uint8Array,a.wasm_memory,c,this.vga_memory_size);this.diff_addr_min=this.vga_memory_size;this.diff_addr_max=0;this.diff_plot_min=this.vga_memory_size;this.diff_plot_max=0;this.image_data=null;this.vga_memory=new Uint8Array(262144);this.plane0=new Uint8Array(this.vga_memory.buffer,0,65536);this.plane1=new Uint8Array(this.vga_memory.buffer,65536,65536);this.plane2=new Uint8Array(this.vga_memory.buffer,131072,65536);this.plane3=new Uint8Array(this.vga_memory.buffer,196608,65536);
|
|
567
545
|
this.pixel_buffer=new Uint8Array(524288);b.mmap_register(655360,131072,e=>this.vga_memory_read(e),(e,f)=>this.vga_memory_write(e,f));a.devices.pci.register_device(this)}Y.prototype.get_state=function(){var a=[];a[0]=this.vga_memory_size;a[1]=this.cursor_address;a[2]=this.cursor_scanline_start;a[3]=this.cursor_scanline_end;a[4]=this.max_cols;a[5]=this.max_rows;a[6]=this.vga_memory;a[7]=this.dac_state;a[8]=this.start_address;a[9]=this.graphical_mode;a[10]=this.vga256_palette;a[11]=this.latch_dword;
|
|
568
546
|
a[12]=this.color_compare;a[13]=this.color_dont_care;a[14]=this.miscellaneous_graphics_register;a[15]=this.svga_width;a[16]=this.svga_height;a[17]=this.crtc_mode;a[18]=this.svga_enabled;a[19]=this.svga_bpp;a[20]=this.svga_bank_offset;a[21]=this.svga_offset;a[22]=this.index_crtc;a[23]=this.dac_color_index_write;a[24]=this.dac_color_index_read;a[25]=this.dac_map;a[26]=this.sequencer_index;a[27]=this.plane_write_bm;a[28]=this.sequencer_memory_mode;a[29]=this.graphics_index;a[30]=this.plane_read;a[31]=
|
|
569
547
|
this.planar_mode;a[32]=this.planar_rotate_reg;a[33]=this.planar_bitmap;a[34]=this.max_scan_line;a[35]=this.miscellaneous_output_register;a[36]=this.port_3DA_value;a[37]=this.dispi_index;a[38]=this.dispi_enable_value;a[39]=this.svga_memory;a[41]=this.attribute_controller_index;a[42]=this.offset_register;a[43]=this.planar_setreset;a[44]=this.planar_setreset_enable;a[45]=this.start_address_latched;a[46]=this.crtc;a[47]=this.horizontal_display_enable_end;a[48]=this.horizontal_blank_start;a[49]=this.vertical_display_enable_end;
|
|
@@ -572,24 +550,24 @@ a[1];this.cursor_scanline_start=a[2];this.cursor_scanline_end=a[3];this.max_cols
|
|
|
572
550
|
a[21];this.index_crtc=a[22];this.dac_color_index_write=a[23];this.dac_color_index_read=a[24];this.dac_map=a[25];this.sequencer_index=a[26];this.plane_write_bm=a[27];this.sequencer_memory_mode=a[28];this.graphics_index=a[29];this.plane_read=a[30];this.planar_mode=a[31];this.planar_rotate_reg=a[32];this.planar_bitmap=a[33];this.max_scan_line=a[34];this.miscellaneous_output_register=a[35];this.port_3DA_value=a[36];this.dispi_index=a[37];this.dispi_enable_value=a[38];this.svga_memory.set(a[39]);this.attribute_controller_index=
|
|
573
551
|
a[41];this.offset_register=a[42];this.planar_setreset=a[43];this.planar_setreset_enable=a[44];this.start_address_latched=a[45];this.crtc.set(a[46]);this.horizontal_display_enable_end=a[47];this.horizontal_blank_start=a[48];this.vertical_display_enable_end=a[49];this.vertical_blank_start=a[50];this.underline_location_register=a[51];this.preset_row_scan=a[52];this.offset_register=a[53];this.palette_source=a[54];this.attribute_mode=a[55];this.color_plane_enable=a[56];this.horizontal_panning=a[57];this.color_select=
|
|
574
552
|
a[58];this.clocking_mode=a[59];this.line_compare=a[60];a[61]&&this.pixel_buffer.set(a[61]);this.dac_mask=void 0===a[62]?255:a[62];this.character_map_select=void 0===a[63]?0:a[63];this.font_page_ab_enabled=void 0===a[64]?0:a[64];this.screen.set_mode(this.graphical_mode);this.graphical_mode?(this.screen_height=this.screen_width=0,this.svga_enabled?(this.set_size_graphical(this.svga_width,this.svga_height,this.svga_width,this.svga_height,this.svga_bpp),this.update_layers()):(this.update_vga_size(),this.update_layers(),
|
|
575
|
-
this.complete_replot())):(this.set_font_bitmap(!0),this.set_size_text(this.max_cols,this.max_rows),this.set_font_page(),this.update_cursor_scanline(),this.update_cursor());this.complete_redraw()};Y.prototype.vga_memory_read=function(a){if(this.svga_enabled)return this.cpu.read8((a-655360|this.svga_bank_offset)+3758096384|0);var b=this.miscellaneous_graphics_register>>2&3;a-=
|
|
553
|
+
this.complete_replot())):(this.set_font_bitmap(!0),this.set_size_text(this.max_cols,this.max_rows),this.set_font_page(),this.update_cursor_scanline(),this.update_cursor());this.complete_redraw()};Y.prototype.vga_memory_read=function(a){if(this.svga_enabled)return this.cpu.read8((a-655360|this.svga_bank_offset)+3758096384|0);var b=this.miscellaneous_graphics_register>>2&3;a-=Xc[b];if(0>a||a>=Yc[b])return B("vga read outside memory space: addr:"+n(a>>>0),256),0;this.latch_dword=this.plane0[a];this.latch_dword|=
|
|
576
554
|
this.plane1[a]<<8;this.latch_dword|=this.plane2[a]<<16;this.latch_dword|=this.plane3[a]<<24;if(this.planar_mode&8)return b=255,this.color_dont_care&1&&(b&=this.plane0[a]^~(this.color_compare&1?255:0)),this.color_dont_care&2&&(b&=this.plane1[a]^~(this.color_compare&2?255:0)),this.color_dont_care&4&&(b&=this.plane2[a]^~(this.color_compare&4?255:0)),this.color_dont_care&8&&(b&=this.plane3[a]^~(this.color_compare&8?255:0)),b;b=this.plane_read;this.graphical_mode?this.sequencer_memory_mode&8?(b=a&3,a&=
|
|
577
|
-
-4):this.planar_mode&16&&(b=a&1,a&=-2):b&=3;return this.vga_memory[b<<16|a]};Y.prototype.vga_memory_write=function(a,b){if(this.svga_enabled)this.cpu.write8((a-655360|this.svga_bank_offset)+3758096384|0,b);else{var c=this.miscellaneous_graphics_register>>2&3;a-=
|
|
578
|
-
b)}};Y.prototype.vga_memory_write_graphical=function(a,b){var c=this.planar_mode&3,d=this.apply_feed(this.planar_bitmap),e=this.apply_expand(this.planar_setreset),f=this.apply_expand(this.planar_setreset_enable);switch(c){case 0:b=this.apply_rotate(b);var
|
|
579
|
-
d);break;case 3:b=this.apply_rotate(b),d&=this.apply_feed(b),
|
|
555
|
+
-4):this.planar_mode&16&&(b=a&1,a&=-2):b&=3;return this.vga_memory[b<<16|a]};Y.prototype.vga_memory_write=function(a,b){if(this.svga_enabled)this.cpu.write8((a-655360|this.svga_bank_offset)+3758096384|0,b);else{var c=this.miscellaneous_graphics_register>>2&3;a-=Xc[c];0>a||a>=Yc[c]?B("vga write outside memory space: addr:"+n(a>>>0)+", value:"+n(b),256):this.graphical_mode?this.vga_memory_write_graphical(a,b):this.plane_write_bm&3?this.vga_memory_write_text_mode(a,b):this.plane_write_bm&4&&(this.plane2[a]=
|
|
556
|
+
b)}};Y.prototype.vga_memory_write_graphical=function(a,b){var c=this.planar_mode&3,d=this.apply_feed(this.planar_bitmap),e=this.apply_expand(this.planar_setreset),f=this.apply_expand(this.planar_setreset_enable);switch(c){case 0:b=this.apply_rotate(b);var g=this.apply_feed(b);g=this.apply_setreset(g,f);g=this.apply_logical(g,this.latch_dword);g=this.apply_bitmask(g,d);break;case 1:g=this.latch_dword;break;case 2:g=this.apply_expand(b);g=this.apply_logical(g,this.latch_dword);g=this.apply_bitmask(g,
|
|
557
|
+
d);break;case 3:b=this.apply_rotate(b),d&=this.apply_feed(b),g=this.apply_bitmask(e,d)}b=15;switch(this.sequencer_memory_mode&12){case 0:b=5<<(a&1);a&=-2;break;case 8:case 12:b=1<<(a&3),a&=-4}b&=this.plane_write_bm;b&1&&(this.plane0[a]=g>>0&255);b&2&&(this.plane1[a]=g>>8&255);b&4&&(this.plane2[a]=g>>16&255);b&8&&(this.plane3[a]=g>>24&255);a=this.vga_addr_to_pixel(a);this.partial_replot(a,a+7)};Y.prototype.apply_feed=function(a){return a|a<<8|a<<16|a<<24};Y.prototype.apply_expand=function(a){return(a&
|
|
580
558
|
1?255:0)|(a&2?255:0)<<8|(a&4?255:0)<<16|(a&8?255:0)<<24};Y.prototype.apply_rotate=function(a){return(a|a<<8)>>>(this.planar_rotate_reg&7)&255};Y.prototype.apply_setreset=function(a,b){var c=this.apply_expand(this.planar_setreset);return(a|b&c)&(~b|c)};Y.prototype.apply_logical=function(a,b){switch(this.planar_rotate_reg&24){case 8:return a&b;case 16:return a|b;case 24:return a^b}return a};Y.prototype.apply_bitmask=function(a,b){return b&a|~b&this.latch_dword};Y.prototype.text_mode_redraw=function(){const a=
|
|
581
|
-
this.scan_line_to_screen_row(this.line_compare),b=Math.max(0,2*(2*this.offset_register-this.max_cols)),c=this.attribute_mode&8,d=this.font_page_ab_enabled?7:15,e=c?7:15,f=this.screen.FLAG_BLINKING,
|
|
582
|
-
p,q,v,this.vga256_palette[this.dac_mask&this.dac_map[r>>4&e]],this.vga256_palette[this.dac_mask&this.dac_map[r&d]]);
|
|
583
|
-
e=this.vga_memory[a|1];var f=this.attribute_mode&8;a=(f&&e&128?this.screen.FLAG_BLINKING:0)|(!this.font_page_ab_enabled||e&8?0:this.screen.FLAG_FONT_PAGE_B);var
|
|
584
|
-
this.start_address?(b=(this.cursor_address-this.start_address)/a|0,a=(this.cursor_address-this.start_address)%a):(b=(this.cursor_address/a|0)+this.scan_line_to_screen_row(this.line_compare),a=this.cursor_address%a);
|
|
559
|
+
this.scan_line_to_screen_row(this.line_compare),b=Math.max(0,2*(2*this.offset_register-this.max_cols)),c=this.attribute_mode&8,d=this.font_page_ab_enabled?7:15,e=c?7:15,f=this.screen.FLAG_BLINKING,g=this.screen.FLAG_FONT_PAGE_B;let k=this.start_address<<1;for(let m=0;m<this.max_rows;m++){m===a&&(k=0);for(let p=0;p<this.max_cols;p++){const q=this.vga_memory[k],r=this.vga_memory[k|1],v=(c&&r&128?f:0)|(!this.font_page_ab_enabled||r&8?0:g);this.bus.send("screen-put-char",[m,p,q]);this.screen.put_char(m,
|
|
560
|
+
p,q,v,this.vga256_palette[this.dac_mask&this.dac_map[r>>4&e]],this.vga256_palette[this.dac_mask&this.dac_map[r&d]]);k+=2}k+=b}};Y.prototype.vga_memory_write_text_mode=function(a,b){this.vga_memory[a]=b;var c=Math.max(this.max_cols,2*this.offset_register);let d;if(a>>1>=this.start_address){var e=(a>>1)-this.start_address;d=e/c|0;c=e%c}else e=a>>1,d=(e/c|0)+this.scan_line_to_screen_row(this.line_compare),c=e%c;l(0<=d&&0<=c);if(!(c>=this.max_cols||d>=this.max_rows)){a&1?(e=b,b=this.vga_memory[a&-2]):
|
|
561
|
+
e=this.vga_memory[a|1];var f=this.attribute_mode&8;a=(f&&e&128?this.screen.FLAG_BLINKING:0)|(!this.font_page_ab_enabled||e&8?0:this.screen.FLAG_FONT_PAGE_B);var g=this.font_page_ab_enabled?7:15;f=f?7:15;this.bus.send("screen-put-char",[d,c,b]);this.screen.put_char(d,c,b,a,this.vga256_palette[this.dac_mask&this.dac_map[e>>4&f]],this.vga256_palette[this.dac_mask&this.dac_map[e&g]])}};Y.prototype.update_cursor=function(){var a=Math.max(this.max_cols,2*this.offset_register);let b;this.cursor_address>=
|
|
562
|
+
this.start_address?(b=(this.cursor_address-this.start_address)/a|0,a=(this.cursor_address-this.start_address)%a):(b=(this.cursor_address/a|0)+this.scan_line_to_screen_row(this.line_compare),a=this.cursor_address%a);l(0<=b&&0<=a);this.screen.update_cursor(b,a)};Y.prototype.complete_redraw=function(){B("complete redraw",256);this.graphical_mode?this.svga_enabled?this.cpu.svga_mark_dirty():(this.diff_addr_min=0,this.diff_addr_max=524288):this.text_mode_redraw()};Y.prototype.complete_replot=function(){B("complete replot",
|
|
585
563
|
256);this.graphical_mode&&!this.svga_enabled&&(this.diff_plot_min=0,this.diff_plot_max=524288,this.complete_redraw())};Y.prototype.partial_redraw=function(a,b){a<this.diff_addr_min&&(this.diff_addr_min=a);b>this.diff_addr_max&&(this.diff_addr_max=b)};Y.prototype.partial_replot=function(a,b){a<this.diff_plot_min&&(this.diff_plot_min=a);b>this.diff_plot_max&&(this.diff_plot_max=b);this.partial_redraw(a,b)};Y.prototype.reset_diffs=function(){this.diff_addr_min=this.vga_memory_size;this.diff_addr_max=
|
|
586
564
|
0;this.diff_plot_min=this.vga_memory_size;this.diff_plot_max=0};Y.prototype.destroy=function(){};Y.prototype.vga_bytes_per_line=function(){var a=this.offset_register<<2;this.underline_location_register&64?a<<=1:this.crtc_mode&64&&(a>>>=1);return a};Y.prototype.vga_addr_shift_count=function(){var a=128+(~this.underline_location_register&this.crtc_mode&64);a-=this.underline_location_register&64;a-=this.attribute_mode&64;return a>>>6};Y.prototype.vga_addr_to_pixel=function(a){var b=this.vga_addr_shift_count();
|
|
587
565
|
if(~this.crtc_mode&3){var c=a-this.start_address;c&=this.crtc_mode<<13|-24577;c<<=b;var d=c/this.virtual_width|0;c%=this.virtual_width;switch(this.crtc_mode&3){case 2:d=d<<1|a>>13&1;break;case 1:d=d<<1|a>>14&1;break;case 0:d=d<<2|a>>13&3}return d*this.virtual_width+c+(this.start_address<<b)}return a<<b};Y.prototype.scan_line_to_screen_row=function(a){this.max_scan_line&128&&(a>>>=1);a=Math.ceil(a/(1+(this.max_scan_line&31)));this.crtc_mode&1||(a<<=1);this.crtc_mode&2||(a<<=1);return a};Y.prototype.set_size_text=
|
|
588
|
-
function(a,b){
|
|
589
|
-
0;this.dest_buffet_offset=
|
|
590
|
-
4,d=4;this.attribute_mode&64?(a>>>=1,c>>>=1,d=8):this.attribute_mode&2&&(d=1);b=this.scan_line_to_screen_row(b);var e=
|
|
591
|
-
this.screen_width)if(!this.palette_source||this.clocking_mode&32)this.layers=[],this.screen.clear_screen();else{var a=this.start_address_latched,b=this.horizontal_panning;this.attribute_mode&64&&(b>>>=1);var c=this.preset_row_scan>>5&3,d=this.vga_addr_to_pixel(a+c);a=d/this.virtual_width|0;var e=d%this.virtual_width+b;d=this.scan_line_to_screen_row(1+this.line_compare);d=Math.min(d,this.screen_height);var f=this.screen_height-d;this.layers=[];e=-e;for(var
|
|
592
|
-
|
|
566
|
+
function(a,b){l(!this.graphical_mode);this.max_cols=a;this.max_rows=b;this.screen.set_size_text(a,b);this.bus.send("screen-set-size",[a,b,0])};Y.prototype.set_size_graphical=function(a,b,c,d,e){l(this.graphical_mode);c=Math.max(c,1);d=Math.max(d,1);if(this.screen_width!==a||this.screen_height!==b||this.virtual_width!==c||this.virtual_height!==d){this.screen_width=a;this.screen_height=b;this.virtual_width=c;this.virtual_height=d;if("undefined"!==typeof ImageData){const f=c*d,g=this.cpu.svga_allocate_dest_buffer(f)>>>
|
|
567
|
+
0;this.dest_buffet_offset=g;this.image_data=new ImageData(new Uint8ClampedArray(this.cpu.wasm_memory.buffer,g,4*f),c,d);this.cpu.svga_mark_dirty()}this.screen.set_size_graphical(a,b,c,d);this.bus.send("screen-set-size",[a,b,e])}};Y.prototype.update_vga_size=function(){if(!this.svga_enabled){var a=Math.min(1+this.horizontal_display_enable_end,this.horizontal_blank_start),b=Math.min(1+this.vertical_display_enable_end,this.vertical_blank_start);if(a&&b)if(this.graphical_mode){a<<=3;var c=this.offset_register<<
|
|
568
|
+
4,d=4;this.attribute_mode&64?(a>>>=1,c>>>=1,d=8):this.attribute_mode&2&&(d=1);b=this.scan_line_to_screen_row(b);var e=Yc[0];const f=this.vga_bytes_per_line();this.set_size_graphical(a,b,c,f?Math.ceil(e/f):b,d);this.update_vertical_retrace();this.update_layers()}else this.max_scan_line&128&&(b>>>=1),c=b/(1+(this.max_scan_line&31))|0,a&&c&&this.set_size_text(a,c)}};Y.prototype.update_layers=function(){this.graphical_mode||this.text_mode_redraw();if(this.svga_enabled)this.layers=[];else if(this.virtual_width&&
|
|
569
|
+
this.screen_width)if(!this.palette_source||this.clocking_mode&32)this.layers=[],this.screen.clear_screen();else{var a=this.start_address_latched,b=this.horizontal_panning;this.attribute_mode&64&&(b>>>=1);var c=this.preset_row_scan>>5&3,d=this.vga_addr_to_pixel(a+c);a=d/this.virtual_width|0;var e=d%this.virtual_width+b;d=this.scan_line_to_screen_row(1+this.line_compare);d=Math.min(d,this.screen_height);var f=this.screen_height-d;this.layers=[];e=-e;for(var g=0;e<this.screen_width;e+=this.virtual_width,
|
|
570
|
+
g++)this.layers.push({image_data:this.image_data,screen_x:e,screen_y:0,buffer_x:0,buffer_y:a+g,buffer_width:this.virtual_width,buffer_height:d});a=0;this.attribute_mode&32||(a=this.vga_addr_to_pixel(c)+b);e=-a;for(g=0;e<this.screen_width;e+=this.virtual_width,g++)this.layers.push({image_data:this.image_data,screen_x:e,screen_y:d,buffer_x:0,buffer_y:g,buffer_width:this.virtual_width,buffer_height:f})}};Y.prototype.update_vertical_retrace=function(){this.port_3DA_value|=8;this.start_address_latched!==
|
|
593
571
|
this.start_address&&(this.start_address_latched=this.start_address,this.update_layers())};Y.prototype.update_cursor_scanline=function(){var a=this.max_scan_line&31;const b=Math.min(a,this.cursor_scanline_start&31);a=Math.min(a,this.cursor_scanline_end&31);this.screen.update_cursor_scanline(b,a,!(this.cursor_scanline_start&32)&&b<a)};Y.prototype.port3C0_write=function(a){if(-1===this.attribute_controller_index)B("attribute controller index register: "+n(a),256),this.attribute_controller_index=a&31,
|
|
594
572
|
B("attribute actual index: "+n(this.attribute_controller_index),256),this.palette_source!==(a&32)&&(this.palette_source=a&32,this.update_layers());else{if(16>this.attribute_controller_index)B("internal palette: "+n(this.attribute_controller_index)+" -> "+n(a),256),this.dac_map[this.attribute_controller_index]=a,this.attribute_mode&64||this.complete_redraw();else switch(this.attribute_controller_index){case 16:B("3C0 / attribute mode control: "+n(a),256);if(this.attribute_mode!==a){var b=this.attribute_mode;
|
|
595
573
|
this.attribute_mode=a;const c=0!==(a&1);this.svga_enabled||this.graphical_mode===c||(this.graphical_mode=c,this.screen.set_mode(this.graphical_mode));(b^a)&64&&this.complete_replot();this.update_vga_size();this.complete_redraw();this.set_font_bitmap(!1)}break;case 18:B("3C0 / color plane enable: "+n(a),256);this.color_plane_enable!==a&&(this.color_plane_enable=a,this.complete_redraw());break;case 19:B("3C0 / horizontal panning: "+n(a),256);this.horizontal_panning!==a&&(this.horizontal_panning=a&15,
|
|
@@ -616,150 +594,150 @@ case 2:return this.horizontal_blank_start;case 7:return this.vertical_display_en
|
|
|
616
594
|
(this.port_3DA_value^=1,this.port_3DA_value&=1):(this.port_3DA_value&1&&(this.port_3DA_value^=8),this.port_3DA_value^=1);this.attribute_controller_index=-1;return a};Y.prototype.port1CE_write=function(a){this.dispi_index=a};Y.prototype.port1CF_write=function(a){B("1CF / dispi write "+n(this.dispi_index)+": "+n(a),256);const b=this.svga_enabled;switch(this.dispi_index){case 0:45248<=a&&45253>=a?this.svga_version=a:B("Invalid version value: "+n(a),256);break;case 1:this.svga_width=a;2560<this.svga_width&&
|
|
617
595
|
(B("svga_width reduced from "+this.svga_width+" to 2560",256),this.svga_width=2560);break;case 2:this.svga_height=a;1600<this.svga_height&&(B("svga_height reduced from "+this.svga_height+" to 1600",256),this.svga_height=1600);break;case 3:this.svga_bpp=a;break;case 4:(this.svga_enabled=1===(a&1))&&0===(a&128)&&this.svga_memory.fill(0);this.dispi_enable_value=a;break;case 5:B("SVGA bank offset: "+n(a<<16),256);this.svga_bank_offset=a<<16;break;case 8:B("SVGA X offset: "+n(a),256);this.svga_offset_x!==
|
|
618
596
|
a&&(this.svga_offset_x=a,this.svga_offset=this.svga_offset_y*this.svga_width+this.svga_offset_x,this.complete_redraw());break;case 9:B("SVGA Y offset: "+n(a*this.svga_width)+" y="+n(a),256);this.svga_offset_y!==a&&(this.svga_offset_y=a,this.svga_offset=this.svga_offset_y*this.svga_width+this.svga_offset_x,this.complete_redraw());break;default:B("Unimplemented dispi write index: "+n(this.dispi_index),256)}!this.svga_enabled||this.svga_width&&this.svga_height||(B("SVGA: disabled because of invalid width/height: "+
|
|
619
|
-
this.svga_width+"x"+this.svga_height,256),this.svga_enabled=!1);
|
|
620
|
-
this.set_size_graphical(this.svga_width,this.svga_height,this.svga_width,this.svga_height,this.svga_bpp));this.svga_enabled||(this.svga_bank_offset=0);this.update_layers()};Y.prototype.port1CF_read=function(){B("1CF / dispi read "+n(this.dispi_index),256);return this.svga_register_read(this.dispi_index)};Y.prototype.svga_register_read=
|
|
621
|
-
case 3:return this.dispi_enable_value&2?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 this.svga_offset_x;case 9:return this.svga_offset_y;case 10:return this.vga_memory_size/65536|0;default:B("Unimplemented dispi read index: "+
|
|
622
|
-
d=~this.crtc_mode&3,e=this.planar_mode&96,f=this.attribute_mode&64;a<=b;){var
|
|
623
|
-
|
|
624
|
-
new Int32Array(this.cpu.wasm_memory.buffer,this.dest_buffet_offset,this.virtual_width*this.virtual_height);var d=255,e=0;this.attribute_mode&128&&(d&=207,e|=this.color_select<<4&48);if(this.attribute_mode&64)for(;a<=b;a++){var f=this.pixel_buffer[a]&d|e;f=this.vga256_palette[f];c[a]=f&65280|f<<16|f>>16|4278190080}else for(d&=63,
|
|
625
|
-
function(){if(this.graphical_mode){if(0===this.image_data.data.byteLength){var a=new Uint8ClampedArray(this.cpu.wasm_memory.buffer,this.dest_buffet_offset,4*this.virtual_width*this.virtual_height);this.image_data=new ImageData(a,this.virtual_width,this.virtual_height);this.update_layers()}if(this.svga_enabled){a=
|
|
626
|
-
this.svga_memory.byteOffset,this.vga_memory_size);for(var b=0;b<e.length;b++){var c=this.vga256_palette[f[b]];e[b]=c&65280|c<<16|c>>16|4278190080}}else this.cpu.svga_fill_pixel_buffer(this.svga_bpp,this.svga_offset),b=15===this.svga_bpp?2:this.svga_bpp/8,a=((this.cpu.svga_dirty_bitmap_min_offset[0]/
|
|
627
|
-
screen_x:0,screen_y:a,buffer_x:0,buffer_y:a,buffer_width:this.svga_width,buffer_height:d-a}]))}else this.vga_replot(),this.vga_redraw(),this.screen.update_buffer(this.layers);this.reset_diffs()}this.update_vertical_retrace()};Y.prototype.set_font_bitmap=function(a){const b=
|
|
628
|
-
[0,2,4,6,1,3,5,7],b=(this.character_map_select&12)>>2|(this.character_map_select&32)>>3,c=this.character_map_select&3|(this.character_map_select&16)>>2;this.font_page_ab_enabled=b!==c;this.screen.set_font_page(a[b],a[c]);this.complete_redraw()};const
|
|
629
|
-
subsystem_device_id:5,common:{initial_port:55296,queues:[{size_supported:32,notify_offset:0},{size_supported:32,notify_offset:0},{size_supported:2,notify_offset:1},{size_supported:64,notify_offset:2}],features:[1,3,32],on_driver_ok:()=>{B("Balloon setup",2048)}},notification:{initial_port:55552,single_handler:!1,handlers:[c=>{const d=this.virtio.queues[c];
|
|
630
|
-
f.byteLength/4;this.actual+=0===c?e:-e}this.virtio.queues[c].flush_replies()},c=>{var d=this.virtio.queues[c];if(d.has_request()){d=d.pop_request();const e=new Uint8Array(d.length_readable);d.get_next_blob(e);let f={};for(let
|
|
631
|
-
f.get_next_blob(e);[e]=K(["w"],e,{offset:0});0===e&&(this.free_cb&&this.free_cb(this.zeroed),1<this.fp_cmd&&(this.fp_cmd=1),this.virtio.notify_config_changes())}if(0<f.length_writable)for(new Uint8Array(0),e=0;e<f.write_buffers.length;++e){let
|
|
632
|
-
read:()=>this.num_pages,write:()=>{}},{bytes:4,name:"actual",read:()=>this.actual,write:()=>{}},{bytes:4,name:"free_page_hint_cmd_id",read:()=>this.fp_cmd,write:()=>{}}]}})}
|
|
633
|
-
[];a[0]=this.virtio;a[1]=this.num_pages;a[2]=this.actual;return a}
|
|
634
|
-
var
|
|
635
|
-
n(z));B("cmdline max="+n(A));B("payload offset="+n(u)+" size="+n(E));B("pref_address="+n(x)+":"+n(F));B("init_size="+n(N));e[528]=255;e[529]=p&-97|128;f[274]=56832;f[253]=65535;B("heap_end_ptr="+n(56832));d+="\x00";
|
|
636
|
-
|
|
637
|
-
b,c){this.stop_idling=c;this.wm=b;this.wasm_patch();this.create_jit_imports();this.wasm_memory=b=this.wm.exports.memory;this.memory_size=
|
|
638
|
-
|
|
639
|
-
this.sysenter_eip=
|
|
640
|
-
[];this.memory_map_write8=[];this.memory_map_read32=[];this.memory_map_write32=[];this.bios={main:null,vga:null};this.instruction_counter=
|
|
641
|
-
0;this.fpu_ip=
|
|
642
|
-
|
|
643
|
-
8;
|
|
644
|
-
f(a,b);f(a+4,c);f(a+8,d);f(a+12,e)};P.prototype.write_blob=function(a,b){
|
|
645
|
-
function(){const a=Object.create(null);a.m=this.wm.exports.memory;for(const b of Object.keys(this.wm.exports))b.startsWith("_")||b.startsWith("zstd")||b.endsWith("_js")||(a[b]=this.wm.exports[b]);this.jit_imports=a};P.prototype.wasm_patch=function(){const a=c=>this.wm.exports[c],b=c=>{const d=a(c);console.assert(d,"Missing import: "+c);return d};this.reset_cpu=b("reset_cpu");this.getiopl=b("getiopl");this.get_eflags=
|
|
646
|
-
b("set_jit_config");this.read8=b("read8");this.read16=b("read16");this.read32s=b("read32s");this.write8=b("write8");this.write16=b("write16");this.write32=b("write32");this.in_mapped_range=b("in_mapped_range");this.fpu_load_tag_word=b("fpu_load_tag_word");this.fpu_load_status_word=b("fpu_load_status_word");this.fpu_get_sti_f64=b("fpu_get_sti_f64");this.translate_address_system_read=b("translate_address_system_read_js");
|
|
647
|
-
b("
|
|
648
|
-
b("
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
a[
|
|
652
|
-
a[
|
|
653
|
-
|
|
654
|
-
a[
|
|
655
|
-
|
|
656
|
-
this.segment_access_bytes.fill(242),this.segment_access_bytes[1]=250):16===a[1].length?(this.segment_is_null.set(a[1].subarray(0,8)),this.segment_access_bytes.set(a[1].subarray(8,16))):
|
|
657
|
-
this.stack_size_32[0]=a[16];this.in_hlt[0]=a[17];this.last_virt_eip[0]=a[18];this.eip_phys[0]=a[19];this.sysenter_cs[0]=a[22];this.sysenter_eip[0]=a[23];this.sysenter_esp[0]=a[24];this.prefixes[0]=a[25];this.flags[0]=a[26];this.flags_changed[0]=a[27];this.last_op1[0]=a[28];this.last_op_size[0]=a[30];this.instruction_pointer[0]=a[37];this.previous_ip[0]=a[38];this.reg32.set(a[39]);this.sreg.set(a[40]);this.dreg.set(a[41]);a[42]&&this.reg_pdpte.set(a[42]);this.set_tsc(a[43][0],
|
|
658
|
-
this.devices.virtio_9p.set_state(a[45]);
|
|
659
|
-
[void 0,void 0]];b[0][0]=a[56]?{is_cdrom:!0,buffer:this.devices.cdrom.buffer}:{is_cdrom:!1,buffer:this.devices.ide.primary.master.buffer};this.devices.ide=new
|
|
660
|
-
this.set_state_pic(a[60]);this.devices.sb16&&this.devices.sb16.set_state(a[61]);this.devices.uart1&&this.devices.uart1.set_state(a[79]);this.devices.uart2&&this.devices.uart2.set_state(a[80]);this.devices.uart3&&this.devices.uart3.set_state(a[81]);this.devices.virtio_console&&this.devices.virtio_console.set_state(a[82]);this.devices.virtio_net&&this.devices.virtio_net.set_state(a[83]);this.devices.virtio_balloon&&this.devices.virtio_balloon.set_state(a[84]);this.fw_value=a[62];this.
|
|
661
|
-
this.
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
this.
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
new
|
|
672
|
-
|
|
673
|
-
a.
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
u)
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
0;
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
P.prototype.dump_stack=function(a,b){var c=this.reg32[4];B("========= STACK ==========");if(b>=a||void 0===b)a=5,b=-5;for(;a>b;a--){var d=" ";a||(d="=> ");d+=n(a,2)+" | ";B(d+n(c+4*a,8)+" | "+n(this.read32s(c+4*a)>>>0))}};P.prototype.debug_get_state=function(a){for(var b=this.protected_mode[0]?
|
|
689
|
-
512?1:0,p={[1]:"c",[4]:"p",[16]:"a",[64]:"z",[128]:"s",[256]:"t",[512]:"i",[1024]:"d",[2048]:"o"},q="",r=0;16>r;r++)p[1<<r]&&(q=c&1<<r?q+p[1<<r]:q+" ");return"mode="+b+"/"+
|
|
690
|
-
P.prototype.get_regs_short=function(){for(var a={eax:0,ecx:1,edx:2,ebx:3,esp:4,ebp:5,esi:6,edi:7},b="eax ecx edx ebx esp ebp esi edi".split(" "),c="",d="",e=0;4>e;e++)c+=b[e]+"="+n(this.reg32[a[b[e]]]>>>0,8)+" ",d+=b[e+4]+"="+n(this.reg32[a[b[e+4]]]>>>0,8)+" ";c+=" ds="+n(this.sreg[3],4)+" es="+n(this.sreg[0],
|
|
691
|
-
2);B(a[1],2)};P.prototype.dump_gdt_ldt=function(){function a(b,c){for(var d=0;d<c;d+=8,b+=8){var e=this.read16(b+2)|this.read8(b+4)<<16|this.read8(b+7)<<24,f=this.read16(b)|(this.read8(b+6)&15)<<16,
|
|
692
|
-
B("gdt: (len = "+n(this.gdtr_size[0])+")");a(this.translate_address_system_read(this.gdtr_offset[0]),this.gdtr_size[0]);B("\nldt: (len = "+n(this.segment_limits[7])+")");a(this.translate_address_system_read(this.segment_offsets[7]),this.segment_limits[7])};P.prototype.dump_idt=function(){for(var a=
|
|
693
|
-
14===(b&31)?"intr gate ":15===(b&31)?"trap gate ":"invalid ";f=b&128?f+" P":f+"NP";B(n(a>>3,4)+" "+n(c>>>0,8)+", "+n(d,4)+"; "+f+"; dpl = "+e+", t = "+b.toString(2))}};P.prototype.dump_page_structures=function(){if(this.cr[4]&32){B("PAE enabled");for(var a=0;4>a;a++){var b=this.read32s(this.cr[3]+
|
|
694
|
-
var u=128===(t&128);return{size:u,global:256===(t&256),accessed:32===(t&32),dirty:64===(t&64),cache_disable:16===(t&16),user:4===(t&4),read_write:2===(t&2),address:(u&&!A?t&(z?4292870144:4290772992):t&4294963200)>>>0}}for(var e=b?512:1024,f=b?8:4,
|
|
695
|
-
" | "+m);else{B("=== "+n(c+(
|
|
696
|
-
a+b).buffer};P.prototype.memory_hex_dump=function(a,b){b=b||64;for(var c,d,e=0;e<b>>4;e++){c=n(a+(e<<4),5)+" ";for(var f=0;16>f;f++)d=this.read8(a+(e<<4)+f),c+=n(d,2)+" ";c+=" ";for(f=0;16>f;f++)d=this.read8(a+(e<<4)+f),c+=33>d||126<d?".":String.fromCharCode(d);B(c)}};P.prototype.used_memory_dump=
|
|
697
|
-
function(a,b,c){if(!this.capstone_decoder){let d=window.cs;"function"===typeof require&&(d=require("./capstone-x86.min.js"));if(void 0===d){B("Warning: Missing capstone library, disassembly not available");return}this.capstone_decoder=[new d.Capstone(d.ARCH_X86,d.MODE_16),new d.Capstone(d.ARCH_X86,
|
|
698
|
-
Array.from(b).map(e=>n(e,2)).join(" "))}};P.prototype.dump_wasm=function(a){if(void 0===this.wabt&&(this.wabt="function"===typeof require?require("./libwabt.cjs"):new window.WabtModule,void 0===this.wabt)){B("Warning: Missing libwabt, wasm dump not available");
|
|
699
|
-
b){this.cpu=a;this.pci=a.devices.pci;this.device_id=b.device_id;this.pci_space=[244,26,b.device_id&255,b.device_id>>8,7,5,16,0,1,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,b.subsystem_device_id&255,b.subsystem_device_id>>
|
|
700
|
-
new Uint32Array(4);this.driver_feature=new Uint32Array(4);for(var c of b.common.features)
|
|
701
|
-
|
|
702
|
-
e=[];e.push(this.create_common_capability(b.common));e.push(this.create_notification_capability(b.notification));e.push(this.create_isr_capability(b.isr_status));b.device_specific&&e.push(this.create_device_specific_capability(b.device_specific));this.init_capabilities(e);
|
|
703
|
-
read:()=>this.device_feature_select,write:b=>{this.device_feature_select=b}},{bytes:4,name:"device_feature",read:()=>this.device_feature[this.device_feature_select]||0,write:()=>{}},{bytes:4,name:"driver_feature_select",read:()=>this.driver_feature_select,write:b=>{this.driver_feature_select=
|
|
704
|
-
(this.driver_feature[this.driver_feature_select]=b&c);this.features_ok=this.features_ok&&!(b&~c)}},{bytes:2,name:"msix_config",read:()=>{B("No msi-x capability supported.",2097152);return 65535},write:()=>{B("No msi-x capability supported.",2097152)}},{bytes:2,name:"num_queues",read:()=>
|
|
705
|
-
2097152):B("Device<"+this.name+"> status: "+(b&1?"ACKNOWLEDGE ":"")+(b&2?"DRIVER ":"")+(b&4?"DRIVER_OK":"")+(b&8?"FEATURES_OK ":"")+(b&64?"DEVICE_NEEDS_RESET":""),2097152);b&~this.device_status&4&&this.device_status&64&&this.notify_config_changes();this.features_ok||(b&8&&B("Removing FEATURES_OK",
|
|
706
|
-
write:b=>{this.queue_select=b;this.queue_selected=this.queue_select<this.queues.length?this.queues[this.queue_select]:null}},{bytes:2,name:"queue_size",read:()=>this.queue_selected?this.queue_selected.size:0,write:b=>{this.queue_selected&&(b&b-1&&(B("Warning: dev<"+this.name+"> Given queue size was not a power of 2. Rounding up to next power of 2.",
|
|
707
|
-
2097152),b=this.queue_selected.size_supported),this.queue_selected.set_size(b))}},{bytes:2,name:"queue_msix_vector",read:()=>{B("No msi-x capability supported.",2097152);return 65535},write:()=>{B("No msi-x capability supported.",2097152)}},{bytes:2,name:"queue_enable",read:()=>this.queue_selected?this.queue_selected.enabled|0:
|
|
708
|
-
2097152))}},{bytes:2,name:"queue_notify_off",read:()=>this.queue_selected?this.queue_selected.notify_offset:0,write:()=>{}},{bytes:4,name:"queue_desc (low dword)",read:()=>this.queue_selected?this.queue_selected.desc_addr:0,write:b=>{this.queue_selected&&(this.queue_selected.desc_addr=
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
bar:2,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array(0),struct:[{bytes:1,name:"isr_status",read:()=>{const b=this.isr_status;this.lower_irq();return b},write:()=>{}}]}};
|
|
712
|
-
64;var c=b;for(const e of a){a=16+e.extra.length;c=b;b=c+a;
|
|
713
|
-
|
|
714
|
-
this.pci_space[c+1]=e.port>>>8&255;this.pci_space[c+2]=e.port>>>16&255;this.pci_space[c+3]=e.port>>>24&255;c=e.port+e.offset;for(const f of e.struct){let
|
|
715
|
-
2097152);return
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
this.
|
|
723
|
-
this.
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
function(){
|
|
729
|
-
function(){return this.cpu.read16(this.
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
pci_id:48,device_id:4169,subsystem_device_id:9,common:{initial_port:43008,queues:[{size_supported:32,notify_offset:0}],features:[0,32,29,28],on_driver_ok:()=>
|
|
735
|
-
read:()=>b,write:()=>{}}].concat(Array.from(Array(254).keys()).map(f=>({bytes:1,name:"mount tag name "+f,read:()=>c[f]||0,write:()=>{}})))}});
|
|
736
|
-
|
|
737
|
-
this.
|
|
738
|
-
function(
|
|
739
|
-
this.
|
|
740
|
-
|
|
741
|
-
case 70:
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
this.replybuffer,7);this.BuildReply(
|
|
745
|
-
7);this.BuildReply(
|
|
746
|
-
d[5]);B("[getlock] fid="+
|
|
747
|
-
4===m.status){B("getattr: unlinked",4194304);this.SendError(
|
|
748
|
-
b,c);
|
|
749
|
-
this.SendReply(a);break;case 50:
|
|
750
|
-
break}if(2===this.fids[
|
|
751
|
-
7);this.BuildReply(
|
|
752
|
-
case 74:
|
|
753
|
-
e=d[1];b=
|
|
754
|
-
b,c);B("[version]: msize="+
|
|
755
|
-
7);this.BuildReply(
|
|
756
|
-
c=K(
|
|
757
|
-
(await this.fs.CloseInode(this.fids[
|
|
758
|
-
95);this.SendReply(a);break;default:B("Error in Virtio9p: Unknown id "+
|
|
759
|
-
"b","h"],f,{offset:0})[2];const
|
|
760
|
-
this.virtio.set_state(a[2]);this.virtqueue=this.virtio.queues[0];this.tag_bufchain=a[3]};
|
|
761
|
-
this.configspace_tagname,async c=>{const d=new Uint8Array(c.length_readable);c.get_next_blob(d);const e=K(["w","b","h"],d,{offset:0})[2];this.tag_bufchain.set(e,c);this.send(d)});this.virtqueue=this.virtio.queues[0]}
|
|
762
|
-
this.virtio.queues[0];this.tag_bufchain=a[3]};
|
|
763
|
-
this.reconnect_interval))};
|
|
764
|
-
Date.now();try{this.socket=new WebSocket(this.url)}catch(b){console.error(b);return}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)}}};
|
|
765
|
-
this.send_queue.slice(-this.send_queue_limit)),this.connect())};
|
|
597
|
+
this.svga_width+"x"+this.svga_height,256),this.svga_enabled=!1);l(4!==this.svga_bpp,"unimplemented svga bpp: 4");l(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);this.svga_enabled?B("SVGA: enabled, "+this.svga_width+"x"+this.svga_height+"x"+this.svga_bpp,256):B("SVGA: disabled",256);this.svga_enabled&&!b&&(this.svga_offset_y=this.svga_offset_x=this.svga_offset=0,this.graphical_mode=!0,this.screen.set_mode(this.graphical_mode),
|
|
598
|
+
this.set_size_graphical(this.svga_width,this.svga_height,this.svga_width,this.svga_height,this.svga_bpp));b&&!this.svga_enabled&&(this.graphical_mode=a=0!==(this.attribute_mode&1),this.screen.set_mode(a),this.update_vga_size(),this.set_font_bitmap(!1),this.complete_redraw());this.svga_enabled||(this.svga_bank_offset=0);this.update_layers()};Y.prototype.port1CF_read=function(){B("1CF / dispi read "+n(this.dispi_index),256);return this.svga_register_read(this.dispi_index)};Y.prototype.svga_register_read=
|
|
599
|
+
function(a){switch(a){case 0:return this.svga_version;case 1:return this.dispi_enable_value&2?2560:this.svga_width;case 2:return this.dispi_enable_value&2?1600:this.svga_height;case 3:return this.dispi_enable_value&2?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 this.svga_offset_x;case 9:return this.svga_offset_y;case 10:return this.vga_memory_size/65536|0;default:B("Unimplemented dispi read index: "+
|
|
600
|
+
n(this.dispi_index),256)}return 255};Y.prototype.vga_replot=function(){for(var a=this.diff_plot_min&-16,b=Math.min(this.diff_plot_max|15,524287),c=this.vga_addr_shift_count(),d=~this.crtc_mode&3,e=this.planar_mode&96,f=this.attribute_mode&64;a<=b;){var g=a>>>c;if(d){var k=a/this.virtual_width|0,m=a-this.virtual_width*k;switch(d){case 1:g=(k&1)<<13;k>>>=1;break;case 2:g=(k&1)<<14;k>>>=1;break;case 3:g=(k&3)<<13,k>>>=2}g|=(k*this.virtual_width+m>>>c)+this.start_address}k=this.plane0[g];m=this.plane1[g];
|
|
601
|
+
var p=this.plane2[g],q=this.plane3[g];g=new Uint8Array(8);switch(e){case 0:k<<=0;m<<=1;p<<=2;q<<=3;for(var r=7;0<=r;r--)g[7-r]=k>>r&1|m>>r&2|p>>r&4|q>>r&8;break;case 32:g[0]=k>>6&3|p>>4&12;g[1]=k>>4&3|p>>2&12;g[2]=k>>2&3|p>>0&12;g[3]=k>>0&3|p<<2&12;g[4]=m>>6&3|q>>4&12;g[5]=m>>4&3|q>>2&12;g[6]=m>>2&3|q>>0&12;g[7]=m>>0&3|q<<2&12;break;case 64:case 96:g[0]=k>>4&15,g[1]=k>>0&15,g[2]=m>>4&15,g[3]=m>>0&15,g[4]=p>>4&15,g[5]=p>>0&15,g[6]=q>>4&15,g[7]=q>>0&15}if(f)for(k=r=0;4>r;r++,a++,k+=2)this.pixel_buffer[a]=
|
|
602
|
+
g[k]<<4|g[k+1];else for(r=0;8>r;r++,a++)this.pixel_buffer[a]=g[r]}};Y.prototype.vga_redraw=function(){var a=this.diff_addr_min,b=Math.min(this.diff_addr_max,524287);const c=new Int32Array(this.cpu.wasm_memory.buffer,this.dest_buffet_offset,this.virtual_width*this.virtual_height);var d=255,e=0;this.attribute_mode&128&&(d&=207,e|=this.color_select<<4&48);if(this.attribute_mode&64)for(;a<=b;a++){var f=this.pixel_buffer[a]&d|e;f=this.vga256_palette[f];c[a]=f&65280|f<<16|f>>16|4278190080}else for(d&=63,
|
|
603
|
+
e|=this.color_select<<4&192;a<=b;a++)f=this.dac_map[this.pixel_buffer[a]&this.color_plane_enable]&d|e,f=this.vga256_palette[f],c[a]=f&65280|f<<16|f>>16|4278190080};Y.prototype.screen_fill_buffer=function(){if(this.graphical_mode){if(0===this.image_data.data.byteLength){var a=new Uint8ClampedArray(this.cpu.wasm_memory.buffer,this.dest_buffet_offset,4*this.virtual_width*this.virtual_height);this.image_data=new ImageData(a,this.virtual_width,this.virtual_height);this.update_layers()}if(this.svga_enabled){a=
|
|
604
|
+
0;let d=this.svga_height;if(8===this.svga_bpp){const e=new Int32Array(this.cpu.wasm_memory.buffer,this.dest_buffet_offset,this.screen_width*this.screen_height),f=new Uint8Array(this.cpu.wasm_memory.buffer,this.svga_memory.byteOffset,this.vga_memory_size);for(var b=0;b<e.length;b++){var c=this.vga256_palette[f[b]];e[b]=c&65280|c<<16|c>>16|4278190080}}else this.cpu.svga_fill_pixel_buffer(this.svga_bpp,this.svga_offset),b=15===this.svga_bpp?2:this.svga_bpp/8,a=((this.cpu.svga_dirty_bitmap_min_offset[0]/
|
|
605
|
+
b|0)-this.svga_offset)/this.svga_width|0,d=(((this.cpu.svga_dirty_bitmap_max_offset[0]/b|0)-this.svga_offset)/this.svga_width|0)+1;a<d&&(a=Math.max(a,0),d=Math.min(d,this.svga_height),this.screen.update_buffer([{image_data:this.image_data,screen_x:0,screen_y:a,buffer_x:0,buffer_y:a,buffer_width:this.svga_width,buffer_height:d-a}]))}else this.vga_replot(),this.vga_redraw(),this.screen.update_buffer(this.layers);this.reset_diffs()}this.update_vertical_retrace()};Y.prototype.set_font_bitmap=function(a){const b=
|
|
606
|
+
this.max_scan_line&31;if(b&&!this.graphical_mode){const c=!!(this.clocking_mode&8);this.screen.set_font_bitmap(b+1,!c&&!(this.clocking_mode&1),c,!!(this.attribute_mode&4),this.plane2,a)}};Y.prototype.set_font_page=function(){const a=[0,2,4,6,1,3,5,7],b=(this.character_map_select&12)>>2|(this.character_map_select&32)>>3,c=this.character_map_select&3|(this.character_map_select&16)>>2;this.font_page_ab_enabled=b!==c;this.screen.set_font_page(a[b],a[c]);this.complete_redraw()};const Zc="SWAP_IN SWAP_OUT MAJFLT MINFLT MEMFREE MEMTOT AVAIL CACHES HTLB_PGALLOC HTLB_PGFAIL".split(" ");
|
|
607
|
+
function $c(a,b){this.bus=b;this.zeroed=this.fp_cmd=this.actual=this.num_pages=0;this.virtio=new Ec(a,{name:"virtio-balloon",pci_id:88,device_id:4165,subsystem_device_id:5,common:{initial_port:55296,queues:[{size_supported:32,notify_offset:0},{size_supported:32,notify_offset:0},{size_supported:2,notify_offset:1},{size_supported:64,notify_offset:2}],features:[1,3,32],on_driver_ok:()=>{B("Balloon setup",2048)}},notification:{initial_port:55552,single_handler:!1,handlers:[c=>{const d=this.virtio.queues[c];
|
|
608
|
+
for(;d.has_request();){var e=d.pop_request();const f=new Uint8Array(e.length_readable);e.get_next_blob(f);this.virtio.queues[c].push_reply(e);e=f.byteLength/4;this.actual+=0===c?e:-e}this.virtio.queues[c].flush_replies()},c=>{var d=this.virtio.queues[c];if(d.has_request()){d=d.pop_request();const e=new Uint8Array(d.length_readable);d.get_next_blob(e);let f={};for(let g=0;g<d.length_readable;g+=10){let [k,m]=K(["h","d"],e,{offset:g});f[Zc[k]]=m}this.virtio.queues[c].push_reply(d);this.stats_cb&&this.stats_cb(f)}},
|
|
609
|
+
c=>{const d=this.virtio.queues[c];for(;d.has_request();){const f=d.pop_request();if(0<f.length_readable){var e=new Uint8Array(f.length_readable);f.get_next_blob(e);[e]=K(["w"],e,{offset:0});0===e&&(this.free_cb&&this.free_cb(this.zeroed),1<this.fp_cmd&&(this.fp_cmd=1),this.virtio.notify_config_changes())}if(0<f.length_writable)for(new Uint8Array(0),e=0;e<f.write_buffers.length;++e){let g=f.write_buffers[e];this.zeroed+=g.len;this.virtio.cpu.zero_memory(g.addr_low,g.len)}this.virtio.queues[c].push_reply(f)}this.virtio.queues[c].flush_replies()}]},
|
|
610
|
+
isr_status:{initial_port:55040},device_specific:{initial_port:54784,struct:[{bytes:4,name:"num_pages",read:()=>this.num_pages,write:()=>{}},{bytes:4,name:"actual",read:()=>this.actual,write:()=>{}},{bytes:4,name:"free_page_hint_cmd_id",read:()=>this.fp_cmd,write:()=>{}}]}})}$c.prototype.Inflate=function(a){this.num_pages+=a;this.virtio.notify_config_changes()};$c.prototype.Deflate=function(a){this.num_pages-=a;this.virtio.notify_config_changes()};$c.prototype.Cleanup=function(a){this.fp_cmd=2;this.free_cb=
|
|
611
|
+
a;this.zeroed=0;this.virtio.notify_config_changes()};$c.prototype.get_state=function(){const a=[];a[0]=this.virtio;a[1]=this.num_pages;a[2]=this.actual;return a};$c.prototype.set_state=function(a){this.virtio.set_state(a[0]);this.num_pages=a[1];this.actual=a[2]};$c.prototype.GetStats=function(a){this.stats_cb=a;for(a=this.virtio.queues[2];a.has_request();){const b=a.pop_request();this.virtio.queues[2].push_reply(b)}this.virtio.queues[2].flush_replies()};$c.prototype.Reset=function(){};function ad(a,
|
|
612
|
+
b,c,d){B("Trying to load kernel of size "+b.byteLength);var e=new Uint8Array(b);const f=new Uint16Array(b);var g=new Uint32Array(b),k=e[497]||4,m=f[255];if(43605!==m)B("Bad checksum1: "+n(m));else if(m=f[257]|f[258]<<16,1400005704!==m)B("Bad checksum2: "+n(m));else{m=f[259];l(514<=m);var p=e[529];l(p&1);var q=f[283],r=g[139],v=g[140],t=e[564],z=e[565],A=518<=m?g[142]:255,u=g[146],E=g[147],F=g[150],x=g[151],N=g[152];B("kernel boot protocol version: "+n(m));B("flags="+n(p)+" xflags="+n(q));B("code32_start="+
|
|
613
|
+
n(g[133]));B("initrd_addr_max="+n(r));B("kernel_alignment="+n(v));B("relocatable="+t);B("min_alignment="+n(z));B("cmdline max="+n(A));B("payload offset="+n(u)+" size="+n(E));B("pref_address="+n(x)+":"+n(F));B("init_size="+n(N));e[528]=255;e[529]=p&-97|128;f[274]=56832;f[253]=65535;B("heap_end_ptr="+n(56832));d+="\x00";l(d.length<A);B("cmd_line_ptr="+n(581632));g[138]=581632;for(e=0;e<d.length;e++)a[581632+e]=d.charCodeAt(e);k=512*(k+1);B("prot_mode_kernel_start="+n(k));d=new Uint8Array(b,0,k);b=new Uint8Array(b,
|
|
614
|
+
k);e=k=0;c&&(k=67108864,e=c.byteLength,l(1048576+b.length<k),a.set(new Uint8Array(c),k));g[134]=k;g[135]=e;l(655360>524288+d.length);a.set(d,524288);a.set(b,1048576);a=new Uint8Array(512);(new Uint16Array(a.buffer))[0]=43605;a[2]=1;c=3;a[c++]=250;a[c++]=184;a[c++]=32768;a[c++]=128;a[c++]=142;a[c++]=192;a[c++]=142;a[c++]=216;a[c++]=142;a[c++]=224;a[c++]=142;a[c++]=232;a[c++]=142;a[c++]=208;a[c++]=188;a[c++]=57344;a[c++]=224;a[c++]=234;a[c++]=0;a[c++]=0;a[c++]=32800;a[c++]=128;l(512>c);g=a[c]=0;for(b=
|
|
615
|
+
0;b<a.length;b++)g+=a[b];a[c]=-g;return{name:"genroms/kernel.bin",data:a}}}function P(a,b,c){this.stop_idling=c;this.wm=b;this.wasm_patch();this.create_jit_imports();this.wasm_memory=b=this.wm.exports.memory;this.memory_size=h(Uint32Array,b,812,1);this.mem8=new Uint8Array(0);this.mem32s=new Int32Array(this.mem8.buffer);this.segment_is_null=h(Uint8Array,b,724,8);this.segment_offsets=h(Int32Array,b,736,8);this.segment_limits=h(Uint32Array,b,768,8);this.segment_access_bytes=h(Uint8Array,b,512,8);this.protected_mode=
|
|
616
|
+
h(Int32Array,b,800,1);this.idtr_size=h(Int32Array,b,564,1);this.idtr_offset=h(Int32Array,b,568,1);this.gdtr_size=h(Int32Array,b,572,1);this.gdtr_offset=h(Int32Array,b,576,1);this.tss_size_32=h(Int32Array,b,1128,1);this.page_fault=h(Uint32Array,b,540,8);this.cr=h(Int32Array,b,580,8);this.cpl=h(Uint8Array,b,612,1);this.is_32=h(Int32Array,b,804,1);this.stack_size_32=h(Int32Array,b,808,1);this.in_hlt=h(Uint8Array,b,616,1);this.last_virt_eip=h(Int32Array,b,620,1);this.eip_phys=h(Int32Array,b,624,1);this.sysenter_cs=
|
|
617
|
+
h(Int32Array,b,636,1);this.sysenter_esp=h(Int32Array,b,640,1);this.sysenter_eip=h(Int32Array,b,644,1);this.prefixes=h(Int32Array,b,648,1);this.flags=h(Int32Array,b,120,1);this.flags_changed=h(Int32Array,b,100,1);this.last_op_size=h(Int32Array,b,96,1);this.last_op1=h(Int32Array,b,104,1);this.last_result=h(Int32Array,b,112,1);this.current_tsc=h(Uint32Array,b,960,2);this.devices={};this.instruction_pointer=h(Int32Array,b,556,1);this.previous_ip=h(Int32Array,b,560,1);this.apic_enabled=h(Uint8Array,b,
|
|
618
|
+
548,1);this.acpi_enabled=h(Uint8Array,b,552,1);this.memory_map_read8=[];this.memory_map_write8=[];this.memory_map_read32=[];this.memory_map_write32=[];this.bios={main:null,vga:null};this.instruction_counter=h(Uint32Array,b,664,1);this.reg32=h(Int32Array,b,64,8);this.fpu_st=h(Int32Array,b,1152,32);this.fpu_stack_empty=h(Uint8Array,b,816,1);this.fpu_stack_empty[0]=255;this.fpu_stack_ptr=h(Uint8Array,b,1032,1);this.fpu_stack_ptr[0]=0;this.fpu_control_word=h(Uint16Array,b,1036,1);this.fpu_control_word[0]=
|
|
619
|
+
895;this.fpu_status_word=h(Uint16Array,b,1040,1);this.fpu_status_word[0]=0;this.fpu_ip=h(Int32Array,b,1048,1);this.fpu_ip[0]=0;this.fpu_ip_selector=h(Int32Array,b,1052,1);this.fpu_ip_selector[0]=0;this.fpu_opcode=h(Int32Array,b,1044,1);this.fpu_opcode[0]=0;this.fpu_dp=h(Int32Array,b,1056,1);this.fpu_dp[0]=0;this.fpu_dp_selector=h(Int32Array,b,1060,1);this.fpu_dp_selector[0]=0;this.reg_xmm32s=h(Int32Array,b,832,32);this.mxcsr=h(Int32Array,b,824,1);this.sreg=h(Uint16Array,b,668,8);this.dreg=h(Int32Array,
|
|
620
|
+
b,684,8);this.reg_pdpte=h(Int32Array,b,968,8);this.svga_dirty_bitmap_min_offset=h(Uint32Array,b,716,1);this.svga_dirty_bitmap_max_offset=h(Uint32Array,b,720,1);this.fw_value=[];this.fw_pointer=0;this.option_roms=[];this.io=void 0;this.bus=a;this.set_tsc(0,0);this.seen_code={};this.seen_code_uncompiled={}}P.prototype.mmap_read8=function(a){a=this.memory_map_read8[a>>>17](a);l(0<=a&&255>=a);return a};P.prototype.mmap_write8=function(a,b){l(0<=b&&255>=b);this.memory_map_write8[a>>>17](a,b)};P.prototype.mmap_read16=
|
|
621
|
+
function(a){var b=this.memory_map_read8[a>>>17];a=b(a)|b(a+1|0)<<8;l(0<=a&&65535>=a);return a};P.prototype.mmap_write16=function(a,b){var c=this.memory_map_write8[a>>>17];l(0<=b&&65535>=b);c(a,b&255);c(a+1|0,b>>8)};P.prototype.mmap_read32=function(a){return this.memory_map_read32[a>>>17](a)};P.prototype.mmap_write32=function(a,b){this.memory_map_write32[a>>>17](a,b)};P.prototype.mmap_write64=function(a,b,c){var d=a>>>17;l(d===a+7>>>17);d=this.memory_map_write32[d];d(a,b);d(a+4,c)};P.prototype.mmap_write128=
|
|
622
|
+
function(a,b,c,d,e){var f=a>>>17;l(f===a+12>>>17);f=this.memory_map_write32[f];f(a,b);f(a+4,c);f(a+8,d);f(a+12,e)};P.prototype.write_blob=function(a,b){l(a&&0<=a.length);a.length&&(l(!this.in_mapped_range(b)),l(!this.in_mapped_range(b+a.length-1)),this.jit_dirty_cache(b,b+a.length),this.mem8.set(a,b))};P.prototype.read_blob=function(a,b){b&&(l(!this.in_mapped_range(a)),l(!this.in_mapped_range(a+b-1)));return this.mem8.subarray(a,a+b)};P.prototype.clear_opstats=function(){(new Uint8Array(this.wasm_memory.buffer,
|
|
623
|
+
32768,131072)).fill(0);this.wm.exports.profiler_init()};P.prototype.create_jit_imports=function(){const a=Object.create(null);a.m=this.wm.exports.memory;for(const b of Object.keys(this.wm.exports))b.startsWith("_")||b.startsWith("zstd")||b.endsWith("_js")||(a[b]=this.wm.exports[b]);this.jit_imports=a};P.prototype.wasm_patch=function(){const a=c=>this.wm.exports[c],b=c=>{const d=a(c);console.assert(d,"Missing import: "+c);return d};this.reset_cpu=b("reset_cpu");this.getiopl=b("getiopl");this.get_eflags=
|
|
624
|
+
b("get_eflags");this.handle_irqs=b("handle_irqs");this.main_loop=b("main_loop");this.set_jit_config=b("set_jit_config");this.read8=b("read8");this.read16=b("read16");this.read32s=b("read32s");this.write8=b("write8");this.write16=b("write16");this.write32=b("write32");this.in_mapped_range=b("in_mapped_range");this.fpu_load_tag_word=b("fpu_load_tag_word");this.fpu_load_status_word=b("fpu_load_status_word");this.fpu_get_sti_f64=b("fpu_get_sti_f64");this.translate_address_system_read=b("translate_address_system_read_js");
|
|
625
|
+
this.get_seg_cs=b("get_seg_cs");this.get_real_eip=b("get_real_eip");this.clear_tlb=b("clear_tlb");this.full_clear_tlb=b("full_clear_tlb");this.update_state_flags=b("update_state_flags");this.set_tsc=b("set_tsc");this.store_current_tsc=b("store_current_tsc");this.set_cpuid_level=b("set_cpuid_level");this.device_raise_irq=b("device_raise_irq");this.device_lower_irq=b("device_lower_irq");this.apic_timer=b("apic_timer");this.jit_force_generate_unsafe=a("jit_force_generate_unsafe");this.jit_clear_cache=
|
|
626
|
+
b("jit_clear_cache_js");this.jit_dirty_cache=b("jit_dirty_cache");this.codegen_finalize_finished=b("codegen_finalize_finished");this.allocate_memory=b("allocate_memory");this.zero_memory=b("zero_memory");this.is_memory_zeroed=b("is_memory_zeroed");this.svga_allocate_memory=b("svga_allocate_memory");this.svga_allocate_dest_buffer=b("svga_allocate_dest_buffer");this.svga_fill_pixel_buffer=b("svga_fill_pixel_buffer");this.svga_mark_dirty=b("svga_mark_dirty");this.get_pic_addr_master=b("get_pic_addr_master");
|
|
627
|
+
this.get_pic_addr_slave=b("get_pic_addr_slave");this.get_apic_addr=b("get_apic_addr");this.get_ioapic_addr=b("get_ioapic_addr");this.zstd_create_ctx=b("zstd_create_ctx");this.zstd_get_src_ptr=b("zstd_get_src_ptr");this.zstd_free_ctx=b("zstd_free_ctx");this.zstd_read=b("zstd_read");this.zstd_read_free=b("zstd_read_free")};P.prototype.jit_force_generate=function(a){this.jit_force_generate_unsafe?this.jit_force_generate_unsafe(a):l(!1,"Not supported in this wasm build: jit_force_generate_unsafe")};P.prototype.jit_clear_func=
|
|
628
|
+
function(a){l(0<=a&&900>a);this.wm.wasm_table.set(a+1024,null)};P.prototype.jit_clear_all_funcs=function(){const a=this.wm.wasm_table;for(let b=0;900>b;b++)a.set(1024+b,null)};P.prototype.get_state=function(){var a=[];a[0]=this.memory_size[0];a[1]=new Uint8Array([...this.segment_is_null,...this.segment_access_bytes]);a[2]=this.segment_offsets;a[3]=this.segment_limits;a[4]=this.protected_mode[0];a[5]=this.idtr_offset[0];a[6]=this.idtr_size[0];a[7]=this.gdtr_offset[0];a[8]=this.gdtr_size[0];a[9]=this.page_fault[0];
|
|
629
|
+
a[10]=this.cr;a[11]=this.cpl[0];a[13]=this.is_32[0];a[16]=this.stack_size_32[0];a[17]=this.in_hlt[0];a[18]=this.last_virt_eip[0];a[19]=this.eip_phys[0];a[22]=this.sysenter_cs[0];a[23]=this.sysenter_eip[0];a[24]=this.sysenter_esp[0];a[25]=this.prefixes[0];a[26]=this.flags[0];a[27]=this.flags_changed[0];a[28]=this.last_op1[0];a[30]=this.last_op_size[0];a[37]=this.instruction_pointer[0];a[38]=this.previous_ip[0];a[39]=this.reg32;a[40]=this.sreg;a[41]=this.dreg;a[42]=this.reg_pdpte;this.store_current_tsc();
|
|
630
|
+
a[43]=this.current_tsc;a[45]=this.devices.virtio_9p;a[46]=this.get_state_apic();a[47]=this.devices.rtc;a[48]=this.devices.pci;a[49]=this.devices.dma;a[50]=this.devices.acpi;a[52]=this.devices.vga;a[53]=this.devices.ps2;a[54]=this.devices.uart0;a[55]=this.devices.fdc;this.devices.ide.secondary?a[85]=this.devices.ide:this.devices.ide.primary?.master.is_atapi?a[56]=this.devices.ide.primary:a[57]=this.devices.ide.primary;a[58]=this.devices.pit;a[59]=this.devices.net;a[60]=this.get_state_pic();a[61]=this.devices.sb16;
|
|
631
|
+
a[62]=this.fw_value;a[63]=this.get_state_ioapic();a[64]=this.tss_size_32[0];a[66]=this.reg_xmm32s;a[67]=this.fpu_st;a[68]=this.fpu_stack_empty[0];a[69]=this.fpu_stack_ptr[0];a[70]=this.fpu_control_word[0];a[71]=this.fpu_ip[0];a[72]=this.fpu_ip_selector[0];a[73]=this.fpu_dp[0];a[74]=this.fpu_dp_selector[0];a[75]=this.fpu_opcode[0];const {packed_memory:b,bitmap:c}=this.pack_memory();a[77]=b;a[78]=new Uint8Array(c.get_buffer());a[79]=this.devices.uart1;a[80]=this.devices.uart2;a[81]=this.devices.uart3;
|
|
632
|
+
a[82]=this.devices.virtio_console;a[83]=this.devices.virtio_net;a[84]=this.devices.virtio_balloon;return a};P.prototype.get_state_pic=function(){const a=new Uint8Array(this.wasm_memory.buffer,this.get_pic_addr_master(),13),b=new Uint8Array(this.wasm_memory.buffer,this.get_pic_addr_slave(),13),c=[],d=[];c[0]=a[0];c[1]=a[1];c[2]=a[2];c[3]=a[3];c[4]=a[4];c[5]=d;c[6]=a[6];c[7]=a[7];c[8]=a[8];c[9]=a[9];c[10]=a[10];c[11]=a[11];c[12]=a[12];d[0]=b[0];d[1]=b[1];d[2]=b[2];d[3]=b[3];d[4]=b[4];d[5]=null;d[6]=
|
|
633
|
+
b[6];d[7]=b[7];d[8]=b[8];d[9]=b[9];d[10]=b[10];d[11]=b[11];d[12]=b[12];return c};P.prototype.get_state_apic=function(){return new Uint8Array(this.wasm_memory.buffer,this.get_apic_addr(),184)};P.prototype.get_state_ioapic=function(){return new Uint8Array(this.wasm_memory.buffer,this.get_ioapic_addr(),208)};P.prototype.set_state=function(a){this.memory_size[0]=a[0];this.mem8.length!==this.memory_size[0]&&console.warn("Note: Memory size mismatch. we="+this.mem8.length+" state="+this.memory_size[0]);
|
|
634
|
+
8===a[1].length?(this.segment_is_null.set(a[1]),this.segment_access_bytes.fill(242),this.segment_access_bytes[1]=250):16===a[1].length?(this.segment_is_null.set(a[1].subarray(0,8)),this.segment_access_bytes.set(a[1].subarray(8,16))):l("Unexpected cpu segment state length:"+a[1].length);this.segment_offsets.set(a[2]);this.segment_limits.set(a[3]);this.protected_mode[0]=a[4];this.idtr_offset[0]=a[5];this.idtr_size[0]=a[6];this.gdtr_offset[0]=a[7];this.gdtr_size[0]=a[8];this.page_fault[0]=a[9];this.cr.set(a[10]);
|
|
635
|
+
this.cpl[0]=a[11];this.is_32[0]=a[13];this.stack_size_32[0]=a[16];this.in_hlt[0]=a[17];this.last_virt_eip[0]=a[18];this.eip_phys[0]=a[19];this.sysenter_cs[0]=a[22];this.sysenter_eip[0]=a[23];this.sysenter_esp[0]=a[24];this.prefixes[0]=a[25];this.flags[0]=a[26];this.flags_changed[0]=a[27];this.last_op1[0]=a[28];this.last_op_size[0]=a[30];this.instruction_pointer[0]=a[37];this.previous_ip[0]=a[38];this.reg32.set(a[39]);this.sreg.set(a[40]);this.dreg.set(a[41]);a[42]&&this.reg_pdpte.set(a[42]);this.set_tsc(a[43][0],
|
|
636
|
+
a[43][1]);this.devices.virtio_9p&&this.devices.virtio_9p.set_state(a[45]);a[46]&&this.set_state_apic(a[46]);this.devices.rtc&&this.devices.rtc.set_state(a[47]);this.devices.dma&&this.devices.dma.set_state(a[49]);this.devices.acpi&&this.devices.acpi.set_state(a[50]);this.devices.vga&&this.devices.vga.set_state(a[52]);this.devices.ps2&&this.devices.ps2.set_state(a[53]);this.devices.uart0&&this.devices.uart0.set_state(a[54]);this.devices.fdc&&this.devices.fdc.set_state(a[55]);if(a[56]||a[57]){var b=
|
|
637
|
+
[[void 0,void 0],[void 0,void 0]];b[0][0]=a[56]?{is_cdrom:!0,buffer:this.devices.cdrom.buffer}:{is_cdrom:!1,buffer:this.devices.ide.primary.master.buffer};this.devices.ide=new Uc(this,this.devices.ide.bus,b);this.devices.cdrom=a[56]?this.devices.ide.primary.master:void 0;this.devices.ide.primary.set_state(a[56]||a[57])}else a[85]&&this.devices.ide.set_state(a[85]);this.devices.pci&&this.devices.pci.set_state(a[48]);this.devices.pit&&this.devices.pit.set_state(a[58]);this.devices.net&&this.devices.net.set_state(a[59]);
|
|
638
|
+
this.set_state_pic(a[60]);this.devices.sb16&&this.devices.sb16.set_state(a[61]);this.devices.uart1&&this.devices.uart1.set_state(a[79]);this.devices.uart2&&this.devices.uart2.set_state(a[80]);this.devices.uart3&&this.devices.uart3.set_state(a[81]);this.devices.virtio_console&&this.devices.virtio_console.set_state(a[82]);this.devices.virtio_net&&this.devices.virtio_net.set_state(a[83]);this.devices.virtio_balloon&&this.devices.virtio_balloon.set_state(a[84]);this.fw_value=a[62];a[63]&&this.set_state_ioapic(a[63]);
|
|
639
|
+
this.tss_size_32[0]=a[64];this.reg_xmm32s.set(a[66]);this.fpu_st.set(a[67]);this.fpu_stack_empty[0]=a[68];this.fpu_stack_ptr[0]=a[69];this.fpu_control_word[0]=a[70];this.fpu_ip[0]=a[71];this.fpu_ip_selector[0]=a[72];this.fpu_dp[0]=a[73];this.fpu_dp_selector[0]=a[74];this.fpu_opcode[0]=a[75];b=new ra(a[78].buffer);this.unpack_memory(b,a[77]);this.update_state_flags();this.full_clear_tlb();this.jit_clear_cache()};P.prototype.set_state_pic=function(a){const b=new Uint8Array(this.wasm_memory.buffer,this.get_pic_addr_master(),
|
|
640
|
+
13),c=new Uint8Array(this.wasm_memory.buffer,this.get_pic_addr_slave(),13);b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];const d=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12]};P.prototype.set_state_apic=function(a){if(a instanceof Array){var b=new Int32Array(this.wasm_memory.buffer,this.get_apic_addr(),46);b[0]=a[0];b[1]=a[1];b[2]=a[2];
|
|
641
|
+
b[3]=a[3];b[4]=a[4];b[7]=a[6];b[8]=a[7];b[9]=a[8];b[10]=a[9];b[11]=a[10];b[12]=a[11];b[13]=a[12];b[14]=a[13];b.set(a[15],16);b.set(a[15],24);b.set(a[16],32);b[40]=a[17];b[41]=a[18];b[42]=a[19];b[43]=a[20];b[44]=a[21];b[45]=a[22]||65536}else b=new Uint8Array(this.wasm_memory.buffer,this.get_apic_addr(),184),l(a instanceof Uint8Array),l(a.length===b.length),b.set(a)};P.prototype.set_state_ioapic=function(a){if(a instanceof Array){l(24===a[0].length);l(24===a[1].length);l(6===a.length);var b=new Int32Array(this.wasm_memory.buffer,
|
|
642
|
+
this.get_ioapic_addr(),52);b.set(a[0],0);b.set(a[1],24);b[48]=a[2];b[49]=a[3];b[50]=a[4];b[51]=a[5]}else b=new Uint8Array(this.wasm_memory.buffer,this.get_ioapic_addr(),208),l(a instanceof Uint8Array),l(a.length===b.length),b.set(a)};P.prototype.pack_memory=function(){l(0===(this.mem8.length&4095));var a=this.mem8.length>>12,b=[];for(var c=0;c<a;c++)this.is_memory_zeroed(c<<12,4096)||b.push(c);a=new ra(a);c=new Uint8Array(b.length<<12);for(const [d,e]of b.entries())a.set(e,1),b=e<<12,b=this.mem8.subarray(b,
|
|
643
|
+
b+4096),c.set(b,d<<12);return{bitmap:a,packed_memory:c}};P.prototype.unpack_memory=function(a,b){this.zero_memory(0,this.memory_size[0]);const c=this.memory_size[0]>>12;let d=0;for(let f=0;f<c;f++)if(a.get(f)){var e=d<<12;e=b.subarray(e,e+4096);this.mem8.set(e,f<<12);d++}};P.prototype.reboot_internal=function(){this.reset_cpu();this.fw_value=[];this.devices.virtio_9p&&this.devices.virtio_9p.reset();this.devices.virtio_console&&this.devices.virtio_console.reset();this.devices.virtio_net&&this.devices.virtio_net.reset();
|
|
644
|
+
this.devices.ps2&&this.devices.ps2.reset();this.load_bios()};P.prototype.reset_memory=function(){this.mem8.fill(0)};P.prototype.create_memory=function(a,b){a<b?(a=b,B("Rounding memory size up to "+a,2)):0>(a|0)&&(a=Math.pow(2,31)-131072,B("Rounding memory size down to "+a,2));a=(a-1|131071)+1|0;l(0<(a|0));l(0===(a&131071));console.assert(0===this.memory_size[0],"Expected uninitialised memory");this.memory_size[0]=a;b=this.allocate_memory(a);this.mem8=h(Uint8Array,this.wasm_memory,b,a);this.mem32s=
|
|
645
|
+
h(Uint32Array,this.wasm_memory,b,a>>2)};P.prototype.init=function(a,b){this.create_memory(a.memory_size||67108864,a.initrd?67108864:1048576);a.disable_jit&&this.set_jit_config(0,1);a.cpuid_level&&this.set_cpuid_level(a.cpuid_level);this.acpi_enabled[0]=+a.acpi;this.reset_cpu();var c=new Fa(this);this.io=c;this.bios.main=a.bios;this.bios.vga=a.vga_bios;this.load_bios();if(a.bzimage){const e=ad(this.mem8,a.bzimage,a.initrd,a.cmdline||"");e&&this.option_roms.push(e)}c.register_read(179,this,function(){B("port 0xB3 read");
|
|
646
|
+
return 0});var d=0;c.register_read(146,this,function(){return d});c.register_write(146,this,function(e){d=e});c.register_read(1297,this,function(){if(this.fw_pointer<this.fw_value.length)return this.fw_value[this.fw_pointer++];l(!1,"config port: Read past value");return 0});c.register_write(1296,this,void 0,function(e){function f(m){return new Uint8Array(Int32Array.of(m).buffer)}function g(m){return m>>8|m<<8&65280}function k(m){return m<<24|m<<8&16711680|m>>8&65280|m>>>24}B("bios config port, index="+
|
|
647
|
+
n(e));this.fw_pointer=0;if(0===e)this.fw_value=f(1431127377);else if(1===e)this.fw_value=f(0);else if(3===e)this.fw_value=f(this.memory_size[0]);else if(5===e)this.fw_value=f(1);else if(15===e)this.fw_value=f(1);else if(13===e)this.fw_value=new Uint8Array(16);else if(25===e){e=new Int32Array(4+64*this.option_roms.length);const m=new Uint8Array(e.buffer);e[0]=k(this.option_roms.length);for(let p=0;p<this.option_roms.length;p++){const {name:q,data:r}=this.option_roms[p],v=4+64*p;l(65536>49152+p);e[v+
|
|
648
|
+
0>>2]=k(r.length);e[v+4>>2]=g(49152+p);l(56>q.length);for(let t=0;t<q.length;t++)m[v+8+t]=q.charCodeAt(t)}this.fw_value=m}else 32768<=e&&49152>e?this.fw_value=f(0):49152<=e&&e-49152<this.option_roms.length?this.fw_value=this.option_roms[e-49152].data:(B("Warning: Unimplemented fw index: "+n(e)),this.fw_value=f(0))});c.register_write(128,this,function(){});c.register_read(128,this,function(){return 255});c.register_write(233,this,function(){});this.devices={};a.load_devices&&(this.devices.pci=new zc(this),
|
|
649
|
+
this.acpi_enabled[0]&&(this.devices.acpi=new xc(this)),this.devices.rtc=new jb(this),this.fill_cmos(this.devices.rtc,a),this.devices.dma=new C(this),this.devices.vga=new Y(this,b,a.screen,a.vga_memory_size||8388608),this.devices.ps2=new Fc(this,b),this.devices.uart0=new yc(this,1016,b),a.uart1&&(this.devices.uart1=new yc(this,760,b)),a.uart2&&(this.devices.uart2=new yc(this,1E3,b)),a.uart3&&(this.devices.uart3=new yc(this,744,b)),this.devices.fdc=new W(this,a.fda,a.fdb),c=[[void 0,void 0],[void 0,
|
|
650
|
+
void 0]],a.hda&&(c[0][0]={buffer:a.hda},c[0][1]={buffer:a.hdb}),c[1][0]={is_cdrom:!0,buffer:a.cdrom},this.devices.ide=new Uc(this,b,c),this.devices.cdrom=this.devices.ide.secondary.master,this.devices.pit=new kb(this,b),"ne2k"===a.net_device.type?this.devices.net=new Cc(this,b,a.preserve_mac_from_state_image,a.mac_address_translation):"virtio"===a.net_device.type&&(this.devices.virtio_net=new Wc(this,b,a.preserve_mac_from_state_image)),a.fs9p?this.devices.virtio_9p=new bd(a.fs9p,this,b):a.handle9p?
|
|
651
|
+
this.devices.virtio_9p=new cd(a.handle9p,this):a.proxy9p&&(this.devices.virtio_9p=new dd(a.proxy9p,this)),a.virtio_console&&(this.devices.virtio_console=new Dc(this,b)),a.virtio_balloon&&(this.devices.virtio_balloon=new $c(this,b)),this.devices.sb16=new D(this,b));a.multiboot&&(B("loading multiboot",2),a=this.load_multiboot_option_rom(a.multiboot,a.initrd,a.cmdline))&&(this.bios.main?(B("adding option rom for multiboot",2),this.option_roms.push(a)):(B("loaded multiboot without bios",2),this.reg32[0]=
|
|
652
|
+
this.io.port_read32(244)));this.debug_init()};P.prototype.load_multiboot=function(a){this.bios.main&&l(!1,"load_multiboot not supported with BIOS");this.load_multiboot_option_rom(a,void 0,"")&&(B("loaded multiboot",2),this.reg32[0]=this.io.port_read32(244))};P.prototype.load_multiboot_option_rom=function(a,b,c){B("Trying multiboot from buffer of size "+a.byteLength,2);if(8192>a.byteLength){var d=new Int32Array(2048);(new Uint8Array(d.buffer)).set(new Uint8Array(a))}else d=new Int32Array(a,0,2048);
|
|
653
|
+
for(var e=0;8192>e;e+=4){if(464367618===d[e>>2]){var f=d[e+4>>2];if(464367618+f+d[e+8>>2]|0){B("Multiboot checksum check failed",2);continue}}else continue;B("Multiboot magic found, flags: "+n(f>>>0,8),2);l(0===(f&-65540),"TODO");var g=this;this.io.register_read(244,this,function(){return 0},function(){return 0},function(){var q=31860,r=0;if(c){r|=4;g.write32(31760,q);c+="\x00";var v=(new TextEncoder).encode(c);g.write_blob(v,q);q+=v.length}if(f&2){r|=64;v=0;g.write32(31788,0);g.write32(31792,q);
|
|
654
|
+
var t=0;let F=!1;for(let x=0;4294967296>x;x+=131072)F&&void 0!==g.memory_map_read8[x>>>17]?(g.write32(q,20),g.write32(q+4,t),g.write32(q+8,0),g.write32(q+12,x-t),g.write32(q+16,0),g.write32(q+20,1),q+=24,v+=24,F=!1):F||void 0!==g.memory_map_read8[x>>>17]||(t=x,F=!0);l(!F,"top of 4GB shouldn't have memory");g.write32(31788,v)}g.write32(31744,r);v=r=0;if(f&65536){B("Multiboot specifies its own address table",2);var z=d[e+12>>2];var A=d[e+16>>2];var u=d[e+20>>2];var E=d[e+24>>2];r=d[e+28>>2];B("header="+
|
|
655
|
+
n(z,8)+" load="+n(A,8)+" load_end="+n(u,8)+" bss_end="+n(E,8)+" entry="+n(r,8));l(A<=z);z=e-(z-A);0===u?v=void 0:(l(u>=A),v=u-A);z=new Uint8Array(a,z,v);g.write_blob(z,A);r|=0;v=Math.max(u,E)}else if(1179403647===d[0]){B("Multiboot image is in elf format",2);t=new DataView(a);const [F,x]=Nc(t,Kc);console.assert(52===x);for(z of Object.keys(F))B(z+": 0x"+(F[z].toString(16)>>>0));console.assert(1179403647===F.magic,"Bad magic");console.assert(1===F.class,"Unimplemented: 64 bit elf");console.assert(1===
|
|
656
|
+
F.data,"Unimplemented: big endian");console.assert(1===F.version0,"Bad version0");console.assert(2===F.type,"Unimplemented type");console.assert(1===F.version1,"Bad version1");console.assert(52===F.ehsize,"Bad header size");console.assert(32===F.phentsize,"Bad program header size");console.assert(40===F.shentsize,"Bad section header size");[r]=Oc(new DataView(t.buffer,t.byteOffset+F.phoff,F.phentsize*F.phnum),Lc,F.phnum);[z]=Oc(new DataView(t.buffer,t.byteOffset+F.shoff,F.shentsize*F.shnum),Mc,F.shnum);
|
|
657
|
+
if(xa){console.log("%d program headers:",r.length);for(E of r)console.log("type=%s offset=%s vaddr=%s paddr=%s filesz=%s memsz=%s flags=%s align=%s",E.type.toString(16),E.offset.toString(16),E.vaddr.toString(16),E.paddr.toString(16),E.filesz.toString(16),E.memsz.toString(16),E.flags.toString(16),E.align.toString(16));console.log("%d section headers:",z.length);for(A of z)console.log("name=%s type=%s flags=%s addr=%s offset=%s size=%s link=%s info=%s addralign=%s entsize=%s",A.name.toString(16),A.type.toString(16),
|
|
658
|
+
A.flags.toString(16),A.addr.toString(16),A.offset.toString(16),A.size.toString(16),A.link.toString(16),A.info.toString(16),A.addralign.toString(16),A.entsize.toString(16))}E=F;A=r;r=E.entry;for(u of A)0!==u.type&&(1===u.type?(l(u.filesz<=u.memsz),u.paddr+u.memsz<g.memory_size[0]?(u.filesz&&(A=new Uint8Array(a,u.offset,u.filesz),g.write_blob(A,u.paddr)),v=Math.max(v,u.paddr+u.memsz),B("prg load "+u.paddr+" to "+(u.paddr+u.memsz),2),r===E.entry&&u.vaddr<=r&&u.vaddr+u.memsz>r&&(r=r-u.vaddr+u.paddr)):
|
|
659
|
+
B("Warning: Skipped loading section, paddr="+n(u.paddr)+" memsz="+u.memsz,2)):2===u.type||3===u.type||4===u.type||6===u.type||7===u.type||1685382480===u.type||1685382481===u.type||1685382482===u.type||1685382483===u.type?B("skip load type "+u.type+" "+u.paddr+" to "+(u.paddr+u.memsz),2):l(!1,"unimplemented elf section type: "+n(u.type)))}else l(!1,"Not a bootable multiboot format");b&&(g.write32(31764,1),g.write32(31768,q),u=v,0!==(u&4095)&&(u=(u&-4096)+4096),B("ramdisk address "+u),E=u+b.byteLength,
|
|
660
|
+
g.write32(q,u),g.write32(q+4,E),g.write32(q+8,0),g.write32(q+12,0),l(E<g.memory_size[0]),g.write_blob(new Uint8Array(b),u));g.reg32[3]=31744;g.cr[0]=1;g.protected_mode[0]=1;g.flags[0]=2;g.is_32[0]=1;g.stack_size_32[0]=1;for(q=0;6>q;q++)g.segment_is_null[q]=0,g.segment_offsets[q]=0,g.segment_limits[q]=4294967295,g.sreg[q]=45058;g.instruction_pointer[0]=g.get_seg_cs()+r|0;g.update_state_flags();B("Starting multiboot kernel at:",2);g.dump_state();g.dump_regs_short();return 732803074});this.io.register_write_consecutive(244,
|
|
661
|
+
this,function(q){console.log("Test exited with code "+n(q,2));throw"HALT";},function(){},function(){},function(){});for(let q=0;15>=q;q++){function r(v){B("kvm-unit-test: Set irq "+n(q)+" to "+n(v,2));v?this.device_raise_irq(q):this.device_lower_irq(q)}this.io.register_write(8192+q,this,r,r,r)}const m=new Uint8Array(512);(new Uint16Array(m.buffer))[0]=43605;m[2]=1;var k=3;m[k++]=102;m[k++]=229;m[k++]=244;l(512>k);let p=m[k]=0;for(let q=0;q<m.length;q++)p+=m[q];m[k]=-p;return{name:"genroms/multiboot.bin",
|
|
662
|
+
data:m}}B("Multiboot header not found",2)};P.prototype.fill_cmos=function(a,b){var c=b.boot_order||291;a.cmos_write(56,1|c>>4&240);a.cmos_write(61,c&255);a.cmos_write(21,128);a.cmos_write(22,2);c=0;1048576<=this.memory_size[0]&&(c=this.memory_size[0]-1048576>>10,c=Math.min(c,65535));a.cmos_write(23,c&255);a.cmos_write(24,c>>8&255);a.cmos_write(48,c&255);a.cmos_write(49,c>>8&255);c=0;16777216<=this.memory_size[0]&&(c=this.memory_size[0]-16777216>>16,c=Math.min(c,65535));a.cmos_write(52,c&255);a.cmos_write(53,
|
|
663
|
+
c>>8&255);a.cmos_write(91,0);a.cmos_write(92,0);a.cmos_write(93,0);a.cmos_write(20,47);a.cmos_write(95,0);b.fastboot&&a.cmos_write(63,1)};P.prototype.load_bios=function(){var a=this.bios.main,b=this.bios.vga;if(a){l(a instanceof ArrayBuffer);var c=new Uint8Array(a);this.write_blob(c,1048576-a.byteLength);if(b){l(b instanceof ArrayBuffer);var d=new Uint8Array(b);this.write_blob(d,786432);this.io.mmap_register(4272947200,1048576,function(e){e=e-4272947200|0;return e<d.length?d[e]:0},function(){l(!1,
|
|
664
|
+
"Unexpected write to VGA rom")})}else B("Warning: No VGA BIOS");this.io.mmap_register(4293918720,1048576,function(e){return this.mem8[e&1048575]}.bind(this),function(e,f){this.mem8[e&1048575]=f}.bind(this))}else B("Warning: No BIOS")};P.prototype.codegen_finalize=function(a,b,c,d,e){d>>>=0;e>>>=0;l(0<=a&&900>a);const f=new Uint8Array(this.wasm_memory.buffer,d,e);this.seen_code[b]=(this.seen_code[b]||0)+1;this.test_hook_did_generate_wasm&&this.test_hook_did_generate_wasm(f);WebAssembly.instantiate(f,
|
|
665
|
+
{e:this.jit_imports}).then(g=>{this.wm.wasm_table.set(a+1024,g.instance.exports.f);this.codegen_finalize_finished(a,b,c);this.test_hook_did_finalize_wasm&&this.test_hook_did_finalize_wasm(f)}).catch(g=>{console.log(g);debugger;throw g;})};P.prototype.log_uncompiled_code=function(){};P.prototype.dump_function_code=function(){};P.prototype.run_hardware_timers=function(a,b){const c=this.devices.pit.timer(b,!1),d=this.devices.rtc.timer(b,!1);let e=100,f=100;a&&(e=this.devices.acpi.timer(b),f=this.apic_timer(b));
|
|
666
|
+
return Math.min(c,d,e,f)};P.prototype.debug_init=function(){function a(c){10===c?(B(b,4096),b=""):b+=String.fromCharCode(c)}if(this.io){var b="";this.io.register_write(1026,this,a);this.io.register_write(1280,this,a)}};P.prototype.dump_stack=function(a,b){var c=this.reg32[4];B("========= STACK ==========");if(b>=a||void 0===b)a=5,b=-5;for(;a>b;a--){var d=" ";a||(d="=> ");d+=n(a,2)+" | ";B(d+n(c+4*a,8)+" | "+n(this.read32s(c+4*a)>>>0))}};P.prototype.debug_get_state=function(a){for(var b=this.protected_mode[0]?
|
|
667
|
+
"prot":"real",c=this.get_eflags(),d=this.getiopl(),e=this.cpl[0],f=n(this.sreg[1],4)+":"+n(this.get_real_eip()>>>0,8),g=n(this.sreg[2],4)+":"+n(this.reg32[0]>>>0,8),k=this.is_32[0]?"32":"16",m=this.flags[0]&512?1:0,p={[1]:"c",[4]:"p",[16]:"a",[64]:"z",[128]:"s",[256]:"t",[512]:"i",[1024]:"d",[2048]:"o"},q="",r=0;16>r;r++)p[1<<r]&&(q=c&1<<r?q+p[1<<r]:q+" ");return"mode="+b+"/"+k+" paging="+ +(0!==(this.cr[0]&-2147483648))+" pae="+ +(0!==(this.cr[4]&32))+" iopl="+d+" cpl="+e+" if="+m+" cs:eip="+f+" cs_off="+
|
|
668
|
+
n(this.get_seg_cs()>>>0,8)+" flgs="+n(this.get_eflags()>>>0,6)+" ("+q+") ss:esp="+g+" ssize="+ +this.stack_size_32[0]+(a?" in "+a:"")};P.prototype.dump_state=function(a){B(this.debug_get_state(a),2)};P.prototype.get_regs_short=function(){for(var a={eax:0,ecx:1,edx:2,ebx:3,esp:4,ebp:5,esi:6,edi:7},b="eax ecx edx ebx esp ebp esi edi".split(" "),c="",d="",e=0;4>e;e++)c+=b[e]+"="+n(this.reg32[a[b[e]]]>>>0,8)+" ",d+=b[e+4]+"="+n(this.reg32[a[b[e+4]]]>>>0,8)+" ";c+=" ds="+n(this.sreg[3],4)+" es="+n(this.sreg[0],
|
|
669
|
+
4)+" fs="+n(this.sreg[4],4);d+=" gs="+n(this.sreg[5],4)+" cs="+n(this.sreg[1],4)+" ss="+n(this.sreg[2],4);return[c,d]};P.prototype.dump_regs_short=function(){var a=this.get_regs_short();B(a[0],2);B(a[1],2)};P.prototype.dump_gdt_ldt=function(){function a(b,c){for(var d=0;d<c;d+=8,b+=8){var e=this.read16(b+2)|this.read8(b+4)<<16|this.read8(b+7)<<24,f=this.read16(b)|(this.read8(b+6)&15)<<16,g=this.read8(b+5),k=this.read8(b+6)>>4,m="",p=g>>5&3;m=g&128?m+" P ":m+"NP ";g&16?(m=k&4?m+"32b ":m+"16b ",g&
|
|
670
|
+
8?(m+="X ",g&4&&(m+="C ")):m+="R ",m+="RW "):m+="sys: "+n(g&15);k&8&&(f=f<<12|4095);B(n(d&-8,4)+" "+n(e>>>0,8)+" ("+n(f>>>0,8)+" bytes) "+m+"; dpl = "+p+", a = "+g.toString(2)+", f = "+k.toString(2))}}B("gdt: (len = "+n(this.gdtr_size[0])+")");a(this.translate_address_system_read(this.gdtr_offset[0]),this.gdtr_size[0]);B("\nldt: (len = "+n(this.segment_limits[7])+")");a(this.translate_address_system_read(this.segment_offsets[7]),this.segment_limits[7])};P.prototype.dump_idt=function(){for(var a=
|
|
671
|
+
0;a<this.idtr_size[0];a+=8){var b=this.translate_address_system_read(this.idtr_offset[0]+a),c=this.read16(b)|this.read16(b+6)<<16,d=this.read16(b+2);b=this.read8(b+5);var e=b>>5&3;var f=5===(b&31)?"task gate ":14===(b&31)?"intr gate ":15===(b&31)?"trap gate ":"invalid ";f=b&128?f+" P":f+"NP";B(n(a>>3,4)+" "+n(c>>>0,8)+", "+n(d,4)+"; "+f+"; dpl = "+e+", t = "+b.toString(2))}};P.prototype.dump_page_structures=function(){if(this.cr[4]&32){B("PAE enabled");for(var a=0;4>a;a++){var b=this.read32s(this.cr[3]+
|
|
672
|
+
8*a);b&1&&this.dump_page_directory(b&4294963200,!0,a<<30)}}else B("PAE disabled"),this.dump_page_directory(this.cr[3],!1,0)};P.prototype.dump_page_directory=function(a,b,c){function d(t,z,A){if(!(t&1))return!1;var u=128===(t&128);return{size:u,global:256===(t&256),accessed:32===(t&32),dirty:64===(t&64),cache_disable:16===(t&16),user:4===(t&4),read_write:2===(t&2),address:(u&&!A?t&(z?4292870144:4290772992):t&4294963200)>>>0}}for(var e=b?512:1024,f=b?8:4,g=b?21:22,k=0;k<e;k++){var m=this.read32s(a+
|
|
673
|
+
k*f),p=d(m,b,!0);if(p)if(m="",m+=p.size?"S ":" ",m+=p.accessed?"A ":" ",m+=p.cache_disable?"Cd ":" ",m+=p.user?"U ":" ",m+=p.read_write?"Rw ":" ",p.size)B("=== "+n(c+(k<<g)>>>0,8)+" -> "+n(p.address>>>0,8)+" | "+m);else{B("=== "+n(c+(k<<g)>>>0,8)+" | "+m);for(var q=0;q<e;q++){var r=p.address+q*f;m=this.read32s(r);var v=d(m,b,!1);v&&(m="",m+=v.cache_disable?"Cd ":" ",m+=v.user?"U ":" ",m+=v.read_write?"Rw ":" ",m+=v.global?"G ":" ",m+=v.accessed?"A ":" ",m+=v.dirty?"Di ":" ",B("# "+
|
|
674
|
+
n(c+(k<<g|q<<12)>>>0,8)+" -> "+n(v.address,8)+" | "+m+" (at "+n(r,8)+")"))}}}};P.prototype.get_memory_dump=function(a,b){void 0===a?(a=0,b=this.memory_size[0]):void 0===b&&(b=a,a=0);return this.mem8.slice(a,a+b).buffer};P.prototype.memory_hex_dump=function(a,b){b=b||64;for(var c,d,e=0;e<b>>4;e++){c=n(a+(e<<4),5)+" ";for(var f=0;16>f;f++)d=this.read8(a+(e<<4)+f),c+=n(d,2)+" ";c+=" ";for(f=0;16>f;f++)d=this.read8(a+(e<<4)+f),c+=33>d||126<d?".":String.fromCharCode(d);B(c)}};P.prototype.used_memory_dump=
|
|
675
|
+
function(){for(var a=this.memory_size[0]/128/16|0,b,c=0;16>c;c++){b=n(128*c*a,8)+" | ";for(var d=0;128>d;d++)b+=0<this.mem32s[(128*c+d)*a]?"X":" ";B(b)}};P.prototype.debug_interrupt=function(){};P.prototype.debug_dump_code=function(a,b,c){if(!this.capstone_decoder){let d=window.cs;"function"===typeof require&&(d=require("./capstone-x86.min.js"));if(void 0===d){B("Warning: Missing capstone library, disassembly not available");return}this.capstone_decoder=[new d.Capstone(d.ARCH_X86,d.MODE_16),new d.Capstone(d.ARCH_X86,
|
|
676
|
+
d.MODE_32)]}b instanceof Array&&(b=new Uint8Array(b));try{this.capstone_decoder[+a].disasm(b,c).forEach(function(d){B(n(d.address>>>0)+": "+ca(d.bytes.map(e=>n(e,2).slice(-2)).join(" "),20)+" "+d.mnemonic+" "+d.op_str)}),B("")}catch(d){B("Could not disassemble: "+Array.from(b).map(e=>n(e,2)).join(" "))}};P.prototype.dump_wasm=function(a){if(void 0===this.wabt&&(this.wabt="function"===typeof require?require("./libwabt.cjs"):new window.WabtModule,void 0===this.wabt)){B("Warning: Missing libwabt, wasm dump not available");
|
|
677
|
+
return}a=a.slice();try{var b=this.wabt.readWasm(a,{readDebugNames:!1});b.generateNames();b.applyNames();const c=b.toText({foldExprs:!0,inlineExport:!0});B(c)}catch(c){qa(a,"failed.wasm"),console.log(c.toString())}finally{b&&b.destroy()}};function Ec(a,b){this.cpu=a;this.pci=a.devices.pci;this.device_id=b.device_id;this.pci_space=[244,26,b.device_id&255,b.device_id>>8,7,5,16,0,1,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,b.subsystem_device_id&255,b.subsystem_device_id>>
|
|
678
|
+
8,0,0,0,0,64,0,0,0,0,0,0,0,0,1,0,0];this.pci_space=this.pci_space.concat(Array(256-this.pci_space.length).fill(0));this.pci_id=b.pci_id;this.pci_bars=[];this.name=b.name;this.driver_feature_select=this.device_feature_select=0;this.device_feature=new Uint32Array(4);this.driver_feature=new Uint32Array(4);for(var c of b.common.features)l(0<=c,"VirtIO device<"+this.name+"> feature bit numbers must be non-negative"),l(128>c,"VirtIO device<"+this.name+"> feature bit numbers assumed less than 128 in implementation"),
|
|
679
|
+
this.device_feature[c>>>5]|=1<<(c&31),this.driver_feature[c>>>5]|=1<<(c&31);l(b.common.features.includes(32),"VirtIO device<"+this.name+"> only non-transitional devices are supported");this.features_ok=!0;this.device_status=0;this.config_has_changed=!1;this.config_generation=0;this.queues=[];for(var d of b.common.queues)this.queues.push(new Z(a,this,d));this.queue_select=0;this.queue_selected=this.queues[0];this.isr_status=0;c=new Set;for(var e of this.queues.map(f=>f.notify_offset))d=b.notification.single_handler?
|
|
680
|
+
0:e,c.add(d),l(b.notification.handlers[d],"VirtIO device<"+this.name+"> every queue's notifier must exist");for(const [f,g]of b.notification.handlers.entries())l(!g||c.has(f),"VirtIO device<"+this.name+"> no defined notify handler should be unused");e=[];e.push(this.create_common_capability(b.common));e.push(this.create_notification_capability(b.notification));e.push(this.create_isr_capability(b.isr_status));b.device_specific&&e.push(this.create_device_specific_capability(b.device_specific));this.init_capabilities(e);
|
|
681
|
+
a.devices.pci.register_device(this);this.reset()}Ec.prototype.create_common_capability=function(a){return{type:1,bar:0,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array(0),struct:[{bytes:4,name:"device_feature_select",read:()=>this.device_feature_select,write:b=>{this.device_feature_select=b}},{bytes:4,name:"device_feature",read:()=>this.device_feature[this.device_feature_select]||0,write:()=>{}},{bytes:4,name:"driver_feature_select",read:()=>this.driver_feature_select,write:b=>{this.driver_feature_select=
|
|
682
|
+
b}},{bytes:4,name:"driver_feature",read:()=>this.driver_feature[this.driver_feature_select]||0,write:b=>{const c=this.device_feature[this.driver_feature_select];this.driver_feature_select<this.driver_feature.length&&(this.driver_feature[this.driver_feature_select]=b&c);this.features_ok=this.features_ok&&!(b&~c)}},{bytes:2,name:"msix_config",read:()=>{B("No msi-x capability supported.",2097152);return 65535},write:()=>{B("No msi-x capability supported.",2097152)}},{bytes:2,name:"num_queues",read:()=>
|
|
683
|
+
this.queues.length,write:()=>{}},{bytes:1,name:"device_status",read:()=>this.device_status,write:b=>{0===b?(B("Reset device<"+this.name+">",2097152),this.reset()):b&128?B("Warning: Device<"+this.name+"> status failed",2097152):B("Device<"+this.name+"> status: "+(b&1?"ACKNOWLEDGE ":"")+(b&2?"DRIVER ":"")+(b&4?"DRIVER_OK":"")+(b&8?"FEATURES_OK ":"")+(b&64?"DEVICE_NEEDS_RESET":""),2097152);b&~this.device_status&4&&this.device_status&64&&this.notify_config_changes();this.features_ok||(b&8&&B("Removing FEATURES_OK",
|
|
684
|
+
2097152),b&=-9);this.device_status=b;if(b&~this.device_status&4)a.on_driver_ok()}},{bytes:1,name:"config_generation",read:()=>this.config_generation,write:()=>{}},{bytes:2,name:"queue_select",read:()=>this.queue_select,write:b=>{this.queue_select=b;this.queue_selected=this.queue_select<this.queues.length?this.queues[this.queue_select]:null}},{bytes:2,name:"queue_size",read:()=>this.queue_selected?this.queue_selected.size:0,write:b=>{this.queue_selected&&(b&b-1&&(B("Warning: dev<"+this.name+"> Given queue size was not a power of 2. Rounding up to next power of 2.",
|
|
685
|
+
2097152),b=1<<fa(b-1)+1),b>this.queue_selected.size_supported&&(B("Warning: dev<"+this.name+"> Trying to set queue size greater than supported. Clamping to supported size.",2097152),b=this.queue_selected.size_supported),this.queue_selected.set_size(b))}},{bytes:2,name:"queue_msix_vector",read:()=>{B("No msi-x capability supported.",2097152);return 65535},write:()=>{B("No msi-x capability supported.",2097152)}},{bytes:2,name:"queue_enable",read:()=>this.queue_selected?this.queue_selected.enabled|0:
|
|
686
|
+
0,write:b=>{this.queue_selected&&(1===b?this.queue_selected.is_configured()?this.queue_selected.enable():B("Driver bug: tried enabling unconfigured queue",2097152):0===b&&B("Driver bug: tried writing 0 to queue_enable",2097152))}},{bytes:2,name:"queue_notify_off",read:()=>this.queue_selected?this.queue_selected.notify_offset:0,write:()=>{}},{bytes:4,name:"queue_desc (low dword)",read:()=>this.queue_selected?this.queue_selected.desc_addr:0,write:b=>{this.queue_selected&&(this.queue_selected.desc_addr=
|
|
687
|
+
b)}},{bytes:4,name:"queue_desc (high dword)",read:()=>0,write:b=>{0!==b&&B("Warning: High dword of 64 bit queue_desc ignored:"+b,2097152)}},{bytes:4,name:"queue_avail (low dword)",read:()=>this.queue_selected?this.queue_selected.avail_addr:0,write:b=>{this.queue_selected&&(this.queue_selected.avail_addr=b)}},{bytes:4,name:"queue_avail (high dword)",read:()=>0,write:b=>{0!==b&&B("Warning: High dword of 64 bit queue_avail ignored:"+b,2097152)}},{bytes:4,name:"queue_used (low dword)",read:()=>this.queue_selected?
|
|
688
|
+
this.queue_selected.used_addr:0,write:b=>{this.queue_selected&&(this.queue_selected.used_addr=b)}},{bytes:4,name:"queue_used (high dword)",read:()=>0,write:b=>{0!==b&&B("Warning: High dword of 64 bit queue_used ignored:"+b,2097152)}}]}};Ec.prototype.create_notification_capability=function(a){const b=[];let c;a.single_handler?(l(1===a.handlers.length,"VirtIO device<"+this.name+"> too many notify handlers specified: expected single handler"),c=0):c=2;for(const [d,e]of a.handlers.entries())b.push({bytes:2,
|
|
689
|
+
name:"notify"+d,read:()=>65535,write:e||(()=>{})});return{type:2,bar:1,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array([c&255,c>>8&255,c>>16&255,c>>24]),struct:b}};Ec.prototype.create_isr_capability=function(a){return{type:3,bar:2,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array(0),struct:[{bytes:1,name:"isr_status",read:()=>{const b=this.isr_status;this.lower_irq();return b},write:()=>{}}]}};Ec.prototype.create_device_specific_capability=function(a){l(~a.offset&3,"VirtIO device<"+
|
|
690
|
+
this.name+"> device specific cap offset must be 4-byte aligned");return{type:4,bar:3,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array(0),struct:a.struct}};Ec.prototype.init_capabilities=function(a){let b=this.pci_space[52]=64;var c=b;for(const e of a){a=16+e.extra.length;c=b;b=c+a;l(256>=b,"VirtIO device<"+this.name+"> can't fit all capabilities into 256byte configspace");l(0<=e.bar&&6>e.bar,"VirtIO device<"+this.name+"> capability invalid bar number");var d=e.struct.reduce((f,g)=>f+
|
|
691
|
+
g.bytes,0);d+=e.offset;d=16>d?16:1<<fa(d-1)+1;l(0===(e.port&d-1),"VirtIO device<"+this.name+"> capability port should be aligned to pci bar size");this.pci_bars[e.bar]={size:d};this.pci_space[c]=9;this.pci_space[c+1]=b;this.pci_space[c+2]=a;this.pci_space[c+3]=e.type;this.pci_space[c+4]=e.bar;this.pci_space[c+5]=0;this.pci_space[c+6]=0;this.pci_space[c+7]=0;this.pci_space[c+8]=e.offset&255;this.pci_space[c+9]=e.offset>>>8&255;this.pci_space[c+10]=e.offset>>>16&255;this.pci_space[c+11]=e.offset>>>
|
|
692
|
+
24;this.pci_space[c+12]=d&255;this.pci_space[c+13]=d>>>8&255;this.pci_space[c+14]=d>>>16&255;this.pci_space[c+15]=d>>>24;for(const [f,g]of e.extra.entries())this.pci_space[c+16+f]=g;c=16+4*e.bar;this.pci_space[c]=e.port&254|!e.use_mmio;this.pci_space[c+1]=e.port>>>8&255;this.pci_space[c+2]=e.port>>>16&255;this.pci_space[c+3]=e.port>>>24&255;c=e.port+e.offset;for(const f of e.struct){let g=f.read;a=f.write;g=()=>{const k=f.read();B("Device<"+this.name+"> cap["+e.type+"] read["+f.name+"] => "+n(k,8*
|
|
693
|
+
f.bytes),2097152);return k};a=k=>{B("Device<"+this.name+"> cap["+e.type+"] write["+f.name+"] <= "+n(k,8*f.bytes),2097152);f.write(k)};if(e.use_mmio)l(!1,"VirtIO device <"+this.name+"> mmio capability not implemented.");else{d=function(p){B("Warning: 8-bit read from 16-bit virtio port",2097152);return g(p&-2)>>((p&1)<<3)&255};const k=function(p){B("Warning: 8-bit read from 32-bit virtio port",2097152);return g(p&-4)>>((p&3)<<3)&255},m=function(p){B("Warning: 32-bit read from 16-bit virtio port",2097152);
|
|
694
|
+
return g(p)};switch(f.bytes){case 4:this.cpu.io.register_read(c,this,k,void 0,g);this.cpu.io.register_read(c+1,this,k);this.cpu.io.register_read(c+2,this,k);this.cpu.io.register_read(c+3,this,k);this.cpu.io.register_write(c,this,void 0,void 0,a);break;case 2:this.cpu.io.register_read(c,this,d,g,m);this.cpu.io.register_read(c+1,this,d);this.cpu.io.register_write(c,this,void 0,a);break;case 1:this.cpu.io.register_read(c,this,g);this.cpu.io.register_write(c,this,a);break;default:l(!1,"VirtIO device <"+
|
|
695
|
+
this.name+"> invalid capability field width of "+f.bytes+" bytes")}}c+=f.bytes}}l(256>=b+20,"VirtIO device<"+this.name+"> can't fit all capabilities into 256byte configspace");this.pci_space[b]=9;this.pci_space[b+1]=0;this.pci_space[b+2]=20;this.pci_space[b+3]=5;this.pci_space[b+4]=0;this.pci_space[b+5]=0;this.pci_space[b+6]=0;this.pci_space[b+7]=0;this.pci_space[b+8]=0;this.pci_space[b+9]=0;this.pci_space[b+10]=0;this.pci_space[b+11]=0;this.pci_space[b+12]=0;this.pci_space[b+13]=0;this.pci_space[b+
|
|
696
|
+
14]=0;this.pci_space[b+15]=0;this.pci_space[b+16]=0;this.pci_space[b+17]=0;this.pci_space[b+18]=0;this.pci_space[b+19]=0};Ec.prototype.get_state=function(){let a=[];a[0]=this.device_feature_select;a[1]=this.driver_feature_select;a[2]=this.device_feature;a[3]=this.driver_feature;a[4]=this.features_ok;a[5]=this.device_status;a[6]=this.config_has_changed;a[7]=this.config_generation;a[8]=this.isr_status;a[9]=this.queue_select;return a=a.concat(this.queues)};Ec.prototype.set_state=function(a){this.device_feature_select=
|
|
697
|
+
a[0];this.driver_feature_select=a[1];this.device_feature=a[2];this.driver_feature=a[3];this.features_ok=a[4];this.device_status=a[5];this.config_has_changed=a[6];this.config_generation=a[7];this.isr_status=a[8];this.queue_select=a[9];let b=0;for(const c of a.slice(10))this.queues[b].set_state(c),b++;this.queue_selected=this.queues[this.queue_select]||null};Ec.prototype.reset=function(){this.driver_feature_select=this.device_feature_select=0;this.driver_feature.set(this.device_feature);this.features_ok=
|
|
698
|
+
!0;this.queue_select=this.device_status=0;this.queue_selected=this.queues[0];for(const a of this.queues)a.reset();this.config_has_changed=!1;this.config_generation=0;this.lower_irq()};Ec.prototype.notify_config_changes=function(){this.config_has_changed=!0;this.device_status&4?this.raise_irq(2):l(!1,"VirtIO device<"+this.name+"> attempted to notify driver before DRIVER_OK")};Ec.prototype.update_config_generation=function(){this.config_has_changed&&(this.config_generation++,this.config_generation&=
|
|
699
|
+
255,this.config_has_changed=!1)};Ec.prototype.is_feature_negotiated=function(a){return 0<(this.driver_feature[a>>>5]&1<<(a&31))};Ec.prototype.needs_reset=function(){B("Device<"+this.name+"> experienced error - requires reset",2097152);this.device_status|=64;this.device_status&4&&this.notify_config_changes()};Ec.prototype.raise_irq=function(a){B("Raise irq "+n(a),2097152);this.isr_status|=a;this.pci.raise_irq(this.pci_id)};Ec.prototype.lower_irq=function(){B("Lower irq ",2097152);this.isr_status=0;
|
|
700
|
+
this.pci.lower_irq(this.pci_id)};function Z(a,b,c){this.cpu=a;this.virtio=b;this.size_supported=this.size=c.size_supported;this.mask=this.size-1;this.enabled=!1;this.notify_offset=c.notify_offset;this.num_staged_replies=this.used_addr=this.avail_last_idx=this.avail_addr=this.desc_addr=0;this.reset()}Z.prototype.get_state=function(){const a=[];a[0]=this.size;a[1]=this.size_supported;a[2]=this.enabled;a[3]=this.notify_offset;a[4]=this.desc_addr;a[5]=this.avail_addr;a[6]=this.avail_last_idx;a[7]=this.used_addr;
|
|
701
|
+
a[8]=this.num_staged_replies;a[9]=1;return a};Z.prototype.set_state=function(a){this.size=a[0];this.size_supported=a[1];this.enabled=a[2];this.notify_offset=a[3];this.desc_addr=a[4];this.avail_addr=a[5];this.avail_last_idx=a[6];this.used_addr=a[7];this.num_staged_replies=a[8];this.mask=this.size-1;this.fix_wrapping=1!==a[9]};Z.prototype.reset=function(){this.enabled=!1;this.num_staged_replies=this.used_addr=this.avail_last_idx=this.avail_addr=this.desc_addr=0;this.set_size(this.size_supported)};Z.prototype.is_configured=
|
|
702
|
+
function(){return this.desc_addr&&this.avail_addr&&this.used_addr};Z.prototype.enable=function(){l(this.is_configured(),"VirtQueue must be configured before enabled");this.enabled=!0};Z.prototype.set_size=function(a){l(0===(a&a-1),"VirtQueue size must be power of 2 or zero");l(a<=this.size_supported,"VirtQueue size must be within supported size");this.size=a;this.mask=a-1};Z.prototype.count_requests=function(){l(this.avail_addr,"VirtQueue addresses must be configured before use");this.fix_wrapping&&
|
|
703
|
+
(this.fix_wrapping=!1,this.avail_last_idx=(this.avail_get_idx()&~this.mask)+(this.avail_last_idx&this.mask));return this.avail_get_idx()-this.avail_last_idx&65535};Z.prototype.has_request=function(){l(this.avail_addr,"VirtQueue addresses must be configured before use");return 0!==this.count_requests()};Z.prototype.pop_request=function(){l(this.avail_addr,"VirtQueue addresses must be configured before use");l(this.has_request(),"VirtQueue must not pop nonexistent request");var a=this.avail_get_entry(this.avail_last_idx);
|
|
704
|
+
B("Pop request: avail_last_idx="+this.avail_last_idx+" desc_idx="+a,2097152);a=new ed(this,a);this.avail_last_idx=this.avail_last_idx+1&65535;return a};Z.prototype.push_reply=function(a){l(this.used_addr,"VirtQueue addresses must be configured before use");l(this.num_staged_replies<this.size,"VirtQueue replies must not exceed queue size");const b=this.used_get_idx()+this.num_staged_replies&this.mask;B("Push reply: used_idx="+b+" desc_idx="+a.head_idx,2097152);this.used_set_entry(b,a.head_idx,a.length_written);
|
|
705
|
+
this.num_staged_replies++};Z.prototype.flush_replies=function(){l(this.used_addr,"VirtQueue addresses must be configured before use");if(0===this.num_staged_replies)B("flush_replies: Nothing to flush",2097152);else{B("Flushing "+this.num_staged_replies+" replies",2097152);var a=this.used_get_idx()+this.num_staged_replies&65535;this.used_set_idx(a);this.num_staged_replies=0;this.virtio.is_feature_negotiated(29)?(this.avail_get_used_event(),this.virtio.raise_irq(1)):~this.avail_get_flags()&1&&this.virtio.raise_irq(1)}};
|
|
706
|
+
Z.prototype.notify_me_after=function(a){l(0<=a,"Must skip a non-negative number of requests");a=this.avail_get_idx()+a&65535;this.used_set_avail_event(a)};Z.prototype.get_descriptor=function(a,b){return{addr_low:this.cpu.read32s(a+16*b),addr_high:this.cpu.read32s(a+16*b+4),len:this.cpu.read32s(a+16*b+8),flags:this.cpu.read16(a+16*b+12),next:this.cpu.read16(a+16*b+14)}};Z.prototype.avail_get_flags=function(){return this.cpu.read16(this.avail_addr)};Z.prototype.avail_get_idx=function(){return this.cpu.read16(this.avail_addr+
|
|
707
|
+
2)};Z.prototype.avail_get_entry=function(a){return this.cpu.read16(this.avail_addr+4+2*(a&this.mask))};Z.prototype.avail_get_used_event=function(){return this.cpu.read16(this.avail_addr+4+2*this.size)};Z.prototype.used_get_flags=function(){return this.cpu.read16(this.used_addr)};Z.prototype.used_set_flags=function(a){this.cpu.write16(this.used_addr,a)};Z.prototype.used_get_idx=function(){return this.cpu.read16(this.used_addr+2)};Z.prototype.used_set_idx=function(a){this.cpu.write16(this.used_addr+
|
|
708
|
+
2,a)};Z.prototype.used_set_entry=function(a,b,c){this.cpu.write32(this.used_addr+4+8*a,b);this.cpu.write32(this.used_addr+8+8*a,c)};Z.prototype.used_set_avail_event=function(a){this.cpu.write16(this.used_addr+4+8*this.size,a)};function ed(a,b){this.cpu=a.cpu;this.virtio=a.virtio;this.head_idx=b;this.read_buffers=[];this.length_readable=this.read_buffer_offset=this.read_buffer_idx=0;this.write_buffers=[];this.length_writable=this.length_written=this.write_buffer_offset=this.write_buffer_idx=0;let c=
|
|
709
|
+
a.desc_addr,d=0,e=a.size,f=!1;const g=this.virtio.is_feature_negotiated(28);B("<<< Descriptor chain start",2097152);do{const k=a.get_descriptor(c,b);B("descriptor: idx="+b+" addr="+n(k.addr_high,8)+":"+n(k.addr_low,8)+" len="+n(k.len,8)+" flags="+n(k.flags,4)+" next="+n(k.next,4),2097152);if(g&&k.flags&4)k.flags&1&&B("Driver bug: has set VIRTQ_DESC_F_NEXT flag in an indirect table descriptor",2097152),c=k.addr_low,d=b=0,e=k.len/16,B("start indirect",2097152);else{if(k.flags&2)f=!0,this.write_buffers.push(k),
|
|
710
|
+
this.length_writable+=k.len;else{if(f){B("Driver bug: readonly buffer after writeonly buffer within chain",2097152);break}this.read_buffers.push(k);this.length_readable+=k.len}d++;if(d>e){B("Driver bug: descriptor chain cycle detected",2097152);break}if(k.flags&1)b=k.next;else break}}while(1);B("Descriptor chain end >>>",2097152)}ed.prototype.get_next_blob=function(a){let b=0,c=a.length;for(;c;){if(this.read_buffer_idx===this.read_buffers.length){B("Device<"+this.virtio.name+"> Read more than device-readable buffers has",
|
|
711
|
+
2097152);break}var d=this.read_buffers[this.read_buffer_idx];const e=d.addr_low+this.read_buffer_offset;d=d.len-this.read_buffer_offset;d>c?(d=c,this.read_buffer_offset+=c):(this.read_buffer_idx++,this.read_buffer_offset=0);a.set(this.cpu.read_blob(e,d),b);b+=d;c-=d}return b};ed.prototype.set_next_blob=function(a){let b=0,c=a.length;for(;c;){if(this.write_buffer_idx===this.write_buffers.length){B("Device<"+this.virtio.name+"> Write more than device-writable capacity",2097152);break}var d=this.write_buffers[this.write_buffer_idx];
|
|
712
|
+
const e=d.addr_low+this.write_buffer_offset;d=d.len-this.write_buffer_offset;d>c?(d=c,this.write_buffer_offset+=c):(this.write_buffer_idx++,this.write_buffer_offset=0);this.cpu.write_blob(a.subarray(b,b+d),e);b+=d;c-=d}this.length_written+=b;return b};const fd=["shared","exclusive","unlock"];function gd(a,b,c,d){const e=new Ec(a,{name:"virtio-9p",pci_id:48,device_id:4169,subsystem_device_id:9,common:{initial_port:43008,queues:[{size_supported:32,notify_offset:0}],features:[0,32,29,28],on_driver_ok:()=>
|
|
713
|
+
{}},notification:{initial_port:43264,single_handler:!1,handlers:[f=>{if(0!==f)l(!1,"Virtio9P Notified for non-existent queue: "+f+" (expected queue_id of 0)");else{for(f=e.queues[0];f.has_request();){const g=f.pop_request();d(g)}f.notify_me_after(0)}}]},isr_status:{initial_port:42752},device_specific:{initial_port:42496,struct:[{bytes:2,name:"mount tag length",read:()=>b,write:()=>{}}].concat(Array.from(Array(254).keys()).map(f=>({bytes:1,name:"mount tag name "+f,read:()=>c[f]||0,write:()=>{}})))}});
|
|
714
|
+
return e}function bd(a,b,c){this.fs=a;this.bus=c;this.configspace_tagname=[104,111,115,116,57,112];this.configspace_taglen=this.configspace_tagname.length;this.virtio=gd(b,this.configspace_taglen,this.configspace_tagname,this.ReceiveRequest.bind(this));this.virtqueue=this.virtio.queues[0];this.VERSION="9P2000.L";this.msize=this.BLOCKSIZE=8192;this.replybuffer=new Uint8Array(2*this.msize);this.replybuffersize=0;this.fids=[]}bd.prototype.get_state=function(){var a=[];a[0]=this.configspace_tagname;a[1]=
|
|
715
|
+
this.configspace_taglen;a[2]=this.virtio;a[3]=this.VERSION;a[4]=this.BLOCKSIZE;a[5]=this.msize;a[6]=this.replybuffer;a[7]=this.replybuffersize;a[8]=this.fids.map(function(b){return[b.inodeid,b.type,b.uid,b.dbg_name]});a[9]=this.fs;return a};bd.prototype.set_state=function(a){this.configspace_tagname=a[0];this.configspace_taglen=a[1];this.virtio.set_state(a[2]);this.virtqueue=this.virtio.queues[0];this.VERSION=a[3];this.BLOCKSIZE=a[4];this.msize=a[5];this.replybuffer=a[6];this.replybuffersize=a[7];
|
|
716
|
+
this.fids=a[8].map(function(b){return{inodeid:b[0],type:b[1],uid:b[2],dbg_name:b[3]}});this.fs.set_state(a[9])};bd.prototype.Createfid=function(a,b,c,d){return{inodeid:a,type:b,uid:c,dbg_name:d}};bd.prototype.update_dbg_name=function(a,b){for(const c of this.fids)c.inodeid===a&&(c.dbg_name=b)};bd.prototype.reset=function(){this.fids=[];this.virtio.reset()};bd.prototype.BuildReply=function(a,b,c){l(0<=c,"9P: Negative payload size");J(["w","b","h"],[c+7,a+1,b],this.replybuffer,0);c+7>=this.replybuffer.length&&
|
|
717
|
+
B("Error in 9p: payloadsize exceeds maximum length",4194304);this.replybuffersize=c+7};bd.prototype.SendError=function(a,b,c){b=J(["w"],[c],this.replybuffer,7);this.BuildReply(6,a,b)};bd.prototype.SendReply=function(a){l(0<=this.replybuffersize,"9P: Negative replybuffersize");a.set_next_blob(this.replybuffer.subarray(0,this.replybuffersize));this.virtqueue.push_reply(a);this.virtqueue.flush_replies()};bd.prototype.ReceiveRequest=async function(a){var b=new Uint8Array(a.length_readable);a.get_next_blob(b);
|
|
718
|
+
var c={offset:0},d=K(["w","b","h"],b,c),e=d[1];d=d[2];switch(e){case 8:var f=this.fs.GetTotalSize();var g=this.fs.GetSpace(),k=[16914839];k[1]=this.BLOCKSIZE;k[2]=Math.floor(g/k[1]);k[3]=k[2]-Math.floor(f/k[1]);k[4]=k[2]-Math.floor(f/k[1]);k[5]=this.fs.CountUsedInodes();k[6]=this.fs.CountFreeInodes();k[7]=0;k[8]=256;f=J("wwddddddw".split(""),k,this.replybuffer,7);this.BuildReply(e,d,f);this.SendReply(a);break;case 112:case 12:k=K(["w","w"],b,c);f=k[0];c=k[1];B("[open] fid="+f+", mode="+c,4194304);
|
|
719
|
+
b=this.fids[f].inodeid;var m=this.fs.GetInode(b);B("file open "+this.fids[f].dbg_name+" tag:"+d,4194304);await this.fs.OpenInode(b,c);k=[];k[0]=m.qid;k[1]=this.msize-24;J(["Q","w"],k,this.replybuffer,7);this.BuildReply(e,d,17);this.SendReply(a);break;case 70:k=K(["w","w","s"],b,c);b=k[0];f=k[1];g=k[2];B("[link] dfid="+b+", name="+g,4194304);f=this.fs.Link(this.fids[b].inodeid,this.fids[f].inodeid,g);if(0>f){-1===f?e="Operation not permitted":(e="Unknown error: "+-f,l(!1,"[link]: Unexpected error code: "+
|
|
720
|
+
-f));this.SendError(d,e,-f);this.SendReply(a);break}this.BuildReply(e,d,0);this.SendReply(a);break;case 16:k=K(["w","s","s","w"],b,c);f=k[0];g=k[1];b=k[2];k=k[3];B("[symlink] fid="+f+", name="+g+", symgt="+b+", gid="+k,4194304);b=this.fs.CreateSymlink(g,this.fids[f].inodeid,b);m=this.fs.GetInode(b);m.uid=this.fids[f].uid;m.gid=k;J(["Q"],[m.qid],this.replybuffer,7);this.BuildReply(e,d,13);this.SendReply(a);break;case 18:k=K("wswwww".split(""),b,c);f=k[0];g=k[1];c=k[2];b=k[3];m=k[4];k=k[5];B("[mknod] fid="+
|
|
721
|
+
f+", name="+g+", major="+b+", minor="+m,4194304);b=this.fs.CreateNode(g,this.fids[f].inodeid,b,m);m=this.fs.GetInode(b);m.mode=c;m.uid=this.fids[f].uid;m.gid=k;J(["Q"],[m.qid],this.replybuffer,7);this.BuildReply(e,d,13);this.SendReply(a);break;case 22:k=K(["w"],b,c);f=k[0];m=this.fs.GetInode(this.fids[f].inodeid);B("[readlink] fid="+f+" name="+this.fids[f].dbg_name+" target="+m.symlink,4194304);f=J(["s"],[m.symlink],this.replybuffer,7);this.BuildReply(e,d,f);this.SendReply(a);break;case 72:k=K(["w",
|
|
722
|
+
"s","w","w"],b,c);f=k[0];g=k[1];c=k[2];k=k[3];B("[mkdir] fid="+f+", name="+g+", mode="+c+", gid="+k,4194304);b=this.fs.CreateDirectory(g,this.fids[f].inodeid);m=this.fs.GetInode(b);m.mode=c|16384;m.uid=this.fids[f].uid;m.gid=k;J(["Q"],[m.qid],this.replybuffer,7);this.BuildReply(e,d,13);this.SendReply(a);break;case 14:k=K(["w","s","w","w","w"],b,c);f=k[0];g=k[1];b=k[2];c=k[3];k=k[4];this.bus.send("9p-create",[g,this.fids[f].inodeid]);B("[create] fid="+f+", name="+g+", flags="+b+", mode="+c+", gid="+
|
|
723
|
+
k,4194304);b=this.fs.CreateFile(g,this.fids[f].inodeid);this.fids[f].inodeid=b;this.fids[f].type=1;this.fids[f].dbg_name=g;m=this.fs.GetInode(b);m.uid=this.fids[f].uid;m.gid=k;m.mode=c|32768;J(["Q","w"],[m.qid,this.msize-24],this.replybuffer,7);this.BuildReply(e,d,17);this.SendReply(a);break;case 52:k=K("wbwddws".split(""),b,c);f=k[0];b=k[2];g=0===k[4]?Infinity:k[4];k=this.fs.DescribeLock(k[1],k[3],g,k[5],k[6]);B("[lock] fid="+f+", type="+fd[k.type]+", start="+k.start+", length="+k.length+", proc_id="+
|
|
724
|
+
k.proc_id);f=this.fs.Lock(this.fids[f].inodeid,k,b);J(["b"],[f],this.replybuffer,7);this.BuildReply(e,d,1);this.SendReply(a);break;case 54:k=K("wbddws".split(""),b,c);f=k[0];g=0===k[3]?Infinity:k[3];k=this.fs.DescribeLock(k[1],k[2],g,k[4],k[5]);B("[getlock] fid="+f+", type="+fd[k.type]+", start="+k.start+", length="+k.length+", proc_id="+k.proc_id);f=this.fs.GetLock(this.fids[f].inodeid,k);f||(f=k,f.type=2);f=J(["b","d","d","w","s"],[f.type,f.start,Infinity===f.length?0:f.length,f.proc_id,f.client_id],
|
|
725
|
+
this.replybuffer,7);this.BuildReply(e,d,f);this.SendReply(a);break;case 24:k=K(["w","d"],b,c);f=k[0];m=this.fs.GetInode(this.fids[f].inodeid);B("[getattr]: fid="+f+" name="+this.fids[f].dbg_name+" request mask="+k[1],4194304);if(!m||4===m.status){B("getattr: unlinked",4194304);this.SendError(d,"No such file or directory",2);this.SendReply(a);break}k[0]=k[1];k[1]=m.qid;k[2]=m.mode;k[3]=m.uid;k[4]=m.gid;k[5]=m.nlinks;k[6]=m.major<<8|m.minor;k[7]=m.size;k[8]=this.BLOCKSIZE;k[9]=Math.floor(m.size/512+
|
|
726
|
+
1);k[10]=m.atime;k[11]=0;k[12]=m.mtime;k[13]=0;k[14]=m.ctime;k[15]=0;k[16]=0;k[17]=0;k[18]=0;k[19]=0;J("dQwwwddddddddddddddd".split(""),k,this.replybuffer,7);this.BuildReply(e,d,153);this.SendReply(a);break;case 26:k=K("wwwwwddddd".split(""),b,c);f=k[0];m=this.fs.GetInode(this.fids[f].inodeid);B("[setattr]: fid="+f+" request mask="+k[1]+" name="+this.fids[f].dbg_name,4194304);k[1]&1&&(m.mode=k[2]);k[1]&2&&(m.uid=k[3]);k[1]&4&&(m.gid=k[4]);k[1]&16&&(m.atime=Math.floor((new Date).getTime()/1E3));k[1]&
|
|
727
|
+
32&&(m.mtime=Math.floor((new Date).getTime()/1E3));k[1]&64&&(m.ctime=Math.floor((new Date).getTime()/1E3));k[1]&128&&(m.atime=k[6]);k[1]&256&&(m.mtime=k[8]);k[1]&8&&await this.fs.ChangeSize(this.fids[f].inodeid,k[5]);this.BuildReply(e,d,0);this.SendReply(a);break;case 50:K(["w","d"],b,c);this.BuildReply(e,d,0);this.SendReply(a);break;case 40:case 116:k=K(["w","d","w"],b,c);f=k[0];g=k[1];var p=k[2];m=this.fs.GetInode(this.fids[f].inodeid);40===e&&B("[treaddir]: fid="+f+" offset="+g+" count="+p,4194304);
|
|
728
|
+
116===e&&B("[read]: fid="+f+" ("+this.fids[f].dbg_name+") offset="+g+" count="+p+" fidtype="+this.fids[f].type,4194304);if(!m||4===m.status){B("read/treaddir: unlinked",4194304);this.SendError(d,"No such file or directory",2);this.SendReply(a);break}if(2===this.fids[f].type)for(m.caps.length<g+p&&(p=m.caps.length-g),k=0;k<p;k++)this.replybuffer[11+k]=m.caps[g+k];else await this.fs.OpenInode(this.fids[f].inodeid,void 0),k=this.fids[f].inodeid,p=Math.min(p,this.replybuffer.length-11),m.size<g+p?p=m.size-
|
|
729
|
+
g:40===e&&(p=this.fs.RoundToDirentry(k,g+p)-g),g>m.size&&(p=0),this.bus.send("9p-read-start",[this.fids[f].dbg_name]),k=await this.fs.Read(k,g,p),this.bus.send("9p-read-end",[this.fids[f].dbg_name,p]),k&&this.replybuffer.set(k,11);J(["w"],[p],this.replybuffer,7);this.BuildReply(e,d,4+p);this.SendReply(a);break;case 118:k=K(["w","d","w"],b,c);f=k[0];g=k[1];p=k[2];k=this.fids[f].dbg_name;B("[write]: fid="+f+" ("+k+") offset="+g+" count="+p+" fidtype="+this.fids[f].type,4194304);if(2===this.fids[f].type){this.SendError(d,
|
|
730
|
+
"Setxattr not supported",95);this.SendReply(a);break}else await this.fs.Write(this.fids[f].inodeid,g,p,b.subarray(c.offset));this.bus.send("9p-write-end",[k,p]);J(["w"],[p],this.replybuffer,7);this.BuildReply(e,d,4);this.SendReply(a);break;case 74:k=K(["w","s","w","s"],b,c);f=k[0];g=k[1];b=k[2];k=k[3];B("[renameat]: oldname="+g+" newname="+k,4194304);f=await this.fs.Rename(this.fids[f].inodeid,g,this.fids[b].inodeid,k);if(0>f){-2===f?e="No such file or directory":-1===f?e="Operation not permitted":
|
|
731
|
+
-39===f?e="Directory not empty":(e="Unknown error: "+-f,l(!1,"[renameat]: Unexpected error code: "+-f));this.SendError(d,e,-f);this.SendReply(a);break}this.BuildReply(e,d,0);this.SendReply(a);break;case 76:k=K(["w","s","w"],b,c);c=k[0];g=k[1];b=k[2];B("[unlink]: dirfd="+c+" name="+g+" flags="+b,4194304);f=this.fs.Search(this.fids[c].inodeid,g);if(-1===f){this.SendError(d,"No such file or directory",2);this.SendReply(a);break}f=this.fs.Unlink(this.fids[c].inodeid,g);if(0>f){-39===f?e="Directory not empty":
|
|
732
|
+
-1===f?e="Operation not permitted":(e="Unknown error: "+-f,l(!1,"[unlink]: Unexpected error code: "+-f));this.SendError(d,e,-f);this.SendReply(a);break}this.BuildReply(e,d,0);this.SendReply(a);break;case 100:f=K(["w","s"],b,c);B("[version]: msize="+f[0]+" version="+f[1],4194304);this.msize!==f[0]&&(this.msize=f[0],this.replybuffer=new Uint8Array(Math.min(16777216,2*this.msize)));f=J(["w","s"],[this.msize,this.VERSION],this.replybuffer,7);this.BuildReply(e,d,f);this.SendReply(a);break;case 104:k=K(["w",
|
|
733
|
+
"w","s","s","w"],b,c);f=k[0];g=k[4];B("[attach]: fid="+f+" afid="+n(k[1])+" uname="+k[2]+" aname="+k[3],4194304);this.fids[f]=this.Createfid(0,1,g,"");m=this.fs.GetInode(this.fids[f].inodeid);J(["Q"],[m.qid],this.replybuffer,7);this.BuildReply(e,d,13);this.SendReply(a);this.bus.send("9p-attach");break;case 108:K(["h"],b,c);B("[flush] "+d,4194304);this.BuildReply(e,d,0);this.SendReply(a);break;case 110:k=K(["w","w","h"],b,c);f=k[0];m=k[1];p=k[2];B("[walk]: fid="+k[0]+" nwfid="+k[1]+" nwname="+p,4194304);
|
|
734
|
+
if(0===p){this.fids[m]=this.Createfid(this.fids[f].inodeid,1,this.fids[f].uid,this.fids[f].dbg_name);J(["h"],[0],this.replybuffer,7);this.BuildReply(e,d,2);this.SendReply(a);break}g=[];for(k=0;k<p;k++)g.push("s");c=K(g,b,c);b=this.fids[f].inodeid;g=9;var q=0;B("walk in dir "+this.fids[f].dbg_name+" to: "+c.toString(),4194304);for(k=0;k<p;k++){b=this.fs.Search(b,c[k]);if(-1===b){B("Could not find: "+c[k],4194304);break}g+=J(["Q"],[this.fs.GetInode(b).qid],this.replybuffer,g);q++;this.fids[m]=this.Createfid(b,
|
|
735
|
+
1,this.fids[f].uid,c[k])}J(["h"],[q],this.replybuffer,7);this.BuildReply(e,d,g-7);this.SendReply(a);break;case 120:k=K(["w"],b,c);B("[clunk]: fid="+k[0],4194304);this.fids[k[0]]&&0<=this.fids[k[0]].inodeid&&(await this.fs.CloseInode(this.fids[k[0]].inodeid),this.fids[k[0]].inodeid=-1,this.fids[k[0]].type=-1);this.BuildReply(e,d,0);this.SendReply(a);break;case 32:k=K(["w","s","d","w"],b,c);f=k[0];g=k[1];c=k[2];b=k[3];B("[txattrcreate]: fid="+f+" name="+g+" attr_size="+c+" flags="+b,4194304);this.fids[f].type=
|
|
736
|
+
2;this.BuildReply(e,d,0);this.SendReply(a);break;case 30:k=K(["w","w","s"],b,c);B("[xattrwalk]: fid="+k[0]+" newfid="+k[1]+" name="+k[2],4194304);this.SendError(d,"Setxattr not supported",95);this.SendReply(a);break;default:B("Error in Virtio9p: Unknown id "+e+" received",4194304),l(!1)}};function cd(a,b){this.handle_fn=a;this.tag_bufchain=new Map;this.configspace_tagname=[104,111,115,116,57,112];this.configspace_taglen=this.configspace_tagname.length;this.virtio=gd(b,this.configspace_taglen,this.configspace_tagname,
|
|
737
|
+
async c=>{const d=new Uint8Array(c.length_readable);c.get_next_blob(d);var e=K(["w","b","h"],d,{offset:0})[2];this.tag_bufchain.set(e,c);this.handle_fn(d,f=>{var g=K(["w","b","h"],f,{offset:0})[2];const k=this.tag_bufchain.get(g);k?(k.set_next_blob(f),this.virtqueue.push_reply(k),this.virtqueue.flush_replies(),this.tag_bufchain.delete(g)):console.error("No bufchain found for tag: "+g)})});this.virtqueue=this.virtio.queues[0]}cd.prototype.get_state=function(){var a=[];a[0]=this.configspace_tagname;
|
|
738
|
+
a[1]=this.configspace_taglen;a[2]=this.virtio;a[3]=this.tag_bufchain;return a};cd.prototype.set_state=function(a){this.configspace_tagname=a[0];this.configspace_taglen=a[1];this.virtio.set_state(a[2]);this.virtqueue=this.virtio.queues[0];this.tag_bufchain=a[3]};cd.prototype.reset=function(){this.virtio.reset()};function dd(a,b){this.socket=void 0;this.cpu=b;this.send_queue=[];this.url=a;this.reconnect_interval=1E4;this.last_connect_attempt=Date.now()-this.reconnect_interval;this.send_queue_limit=
|
|
739
|
+
64;this.destroyed=!1;this.tag_bufchain=new Map;this.configspace_tagname=[104,111,115,116,57,112];this.configspace_taglen=this.configspace_tagname.length;this.virtio=gd(b,this.configspace_taglen,this.configspace_tagname,async c=>{const d=new Uint8Array(c.length_readable);c.get_next_blob(d);const e=K(["w","b","h"],d,{offset:0})[2];this.tag_bufchain.set(e,c);this.send(d)});this.virtqueue=this.virtio.queues[0]}dd.prototype.get_state=function(){var a=[];a[0]=this.configspace_tagname;a[1]=this.configspace_taglen;
|
|
740
|
+
a[2]=this.virtio;a[3]=this.tag_bufchain;return a};dd.prototype.set_state=function(a){this.configspace_tagname=a[0];this.configspace_taglen=a[1];this.virtio.set_state(a[2]);this.virtqueue=this.virtio.queues[0];this.tag_bufchain=a[3]};dd.prototype.reset=function(){this.virtio.reset()};dd.prototype.handle_message=function(a){a=new Uint8Array(a.data);const b=K(["w","b","h"],a,{offset:0})[2],c=this.tag_bufchain.get(b);c?(c.set_next_blob(a),this.virtqueue.push_reply(c),this.virtqueue.flush_replies(),this.tag_bufchain.delete(b)):
|
|
741
|
+
console.error("Virtio9pProxy: No bufchain found for tag: "+b)};dd.prototype.handle_close=function(){this.destroyed||(this.connect(),setTimeout(this.connect.bind(this),this.reconnect_interval))};dd.prototype.handle_open=function(){for(var a=0;a<this.send_queue.length;a++)this.send(this.send_queue[a]);this.send_queue=[]};dd.prototype.handle_error=function(){};dd.prototype.destroy=function(){this.destroyed=!0;this.socket&&this.socket.close()};dd.prototype.connect=function(){if("undefined"!==typeof WebSocket){if(this.socket){var a=
|
|
742
|
+
this.socket.readyState;if(0===a||1===a)return}a=Date.now();if(!(this.last_connect_attempt+this.reconnect_interval>a)){this.last_connect_attempt=Date.now();try{this.socket=new WebSocket(this.url)}catch(b){console.error(b);return}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)}}};dd.prototype.send=function(a){this.socket&&
|
|
743
|
+
1===this.socket.readyState?this.socket.send(a):(this.send_queue.push(a),this.send_queue.length>2*this.send_queue_limit&&(this.send_queue=this.send_queue.slice(-this.send_queue_limit)),this.connect())};dd.prototype.change_proxy=function(a){this.url=a;this.socket&&(this.socket.onclose=function(){},this.socket.onerror=function(){},this.socket.close(),this.socket=void 0)};export{};; export default module.exports.V86; export let {V86, CPU} = module.exports;
|