radio86-emulator 1.0.1

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/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # radio86-emulator
2
+
3
+ Эмулятор Радио-86РК (Intel 8080) в виде web component `<radio86-emulator>`.
4
+
5
+ Монитор-ROM встроен в бандл — компонент стартует без сетевых запросов.
6
+
7
+ ## Установка
8
+
9
+ ```bash
10
+ npm install radio86-emulator
11
+ ```
12
+
13
+ ## Использование
14
+
15
+ ```html
16
+ <script type="module">
17
+ import "radio86-emulator";
18
+ </script>
19
+
20
+ <radio86-emulator></radio86-emulator>
21
+ ```
22
+
23
+ С автозагрузкой программы (файл хостится у вас):
24
+
25
+ ```html
26
+ <radio86-emulator files-path="/files/" file="CHESS.GAM"></radio86-emulator>
27
+ ```
28
+
29
+ ## Атрибуты
30
+
31
+ - `monitor` — имя монитор-ROM. По умолчанию `mon32.bin`. Встроены
32
+ `mon32.bin` и `mon32-color.bin`. Любое другое имя загружается через
33
+ `fetch(\`${files-path}${monitor}\`)`.
34
+ - `file` — программа для автозагрузки (`.rk`, `.gam`, `.bin`, snapshot
35
+ `.json`, `#!rk86` hex-dump). Загружается через `fetch`.
36
+ - `files-path` — база для `fetch` файлов программ. По умолчанию `files/`.
37
+ - `scale` — `auto` для масштабирования браузером. По умолчанию 1:1 с
38
+ `image-rendering: pixelated`.
39
+ - `focusable` — слушать клавиатуру только когда элемент в фокусе
40
+ (`tabindex=0`). Без атрибута — клавиатура слушается на `document`.
41
+
42
+ ## Событие `ready`
43
+
44
+ ```js
45
+ const emu = document.querySelector("radio86-emulator");
46
+ emu.addEventListener("ready", (e) => {
47
+ const { machine } = e.detail;
48
+ // machine.reset(), machine.restart(), machine.pause(true|false)
49
+ });
50
+ ```
51
+
52
+ ## Лицензия
53
+
54
+ MIT
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "radio86-emulator",
3
+ "version": "1.0.1",
4
+ "description": "Эмулятор Радио-86РК (Intel 8080) — web component <radio86-emulator>",
5
+ "type": "module",
6
+ "main": "./radio86-emulator.js",
7
+ "module": "./radio86-emulator.js",
8
+ "exports": {
9
+ ".": "./radio86-emulator.js"
10
+ },
11
+ "files": [
12
+ "radio86-emulator.js",
13
+ "README.md"
14
+ ],
15
+ "sideEffects": [
16
+ "./radio86-emulator.js"
17
+ ],
18
+ "keywords": [
19
+ "rk86",
20
+ "radio-86rk",
21
+ "emulator",
22
+ "intel-8080",
23
+ "i8080",
24
+ "retro",
25
+ "web-component",
26
+ "custom-element"
27
+ ],
28
+ "author": "Alexander Demin",
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/begoon/rk86-js-web"
33
+ }
34
+ }
@@ -0,0 +1,2 @@
1
+ function u(A,B){return A.toString(16).toUpperCase()}function G(A,B){return(B?B:"")+u(A&255,B).padStart(2,"0")}function X(A,B){return(B?B:"")+u(A&65535,B).padStart(4,"0")}function y(A){return A.map((B)=>G(B)).join(" ")}function j(A){if(typeof A==="string")return A.startsWith("0x")?parseInt(A,16):parseInt(A);return A}class K{memory;io;sp=0;pc=0;iff=0;pf=0;hf=0;sf=0;zf=0;cf=0;regs=[0,0,0,0,0,0,0,0];static F_CARRY=1;static F_UN1=2;static F_PARITY=4;static F_UN3=8;static F_HCARRY=16;static F_UN5=32;static F_ZERO=64;static F_NEG=128;parity_table=[[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1],[0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0],[0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0],[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1],[0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0],[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1],[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1],[0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0],[0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0],[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1],[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1],[0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0],[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1],[0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0],[0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0],[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1]].flat();half_carry_table=[0,0,1,0,1,0,1,1];sub_half_carry_table=[0,1,1,1,0,0,0,1];constructor(A){this.memory=A.memory,this.io=A.io}export(){let A=(g)=>"0x"+G(g),B=(g)=>"0x"+X(g);return{a:A(this.a()),sf:this.sf?1:0,zf:this.zf?1:0,hf:this.hf?1:0,pf:this.pf?1:0,cf:this.cf?1:0,bc:B(this.bc()),de:B(this.de()),hl:B(this.hl()),sp:B(this.sp),pc:B(this.pc),iff:this.iff?1:0}}import(A){let B=j;this.set_a(B(A.a)),this.sf=A.sf,this.zf=A.zf,this.hf=A.hf,this.pf=A.pf,this.cf=A.cf,this.set_rp(0,B(A.bc)),this.set_rp(2,B(A.de)),this.set_rp(4,B(A.hl)),this.set_rp(6,B(A.sp)),this.pc=B(A.pc),this.iff=B(A.iff)}memory_read_byte(A){return this.memory.read(A&65535)&255}memory_write_byte(A,B){this.memory.write(A&65535,B&255)}memory_read_word(A){return this.memory_read_byte(A+1)<<8|this.memory_read_byte(A)}memory_write_word(A,B){this.memory_write_byte(A+1,B>>8),this.memory_write_byte(A,B&255)}reg(A){return A!=6?this.regs[A]:this.memory_read_byte(this.hl())}set_reg(A,B){let g=B&255;if(A!=6)this.regs[A]=g;else this.memory_write_byte(this.hl(),g)}rp(A){return A!=6?this.regs[A]<<8|this.regs[A+1]:this.sp}set_rp(A,B){if(A!=6)this.set_reg(A,B>>8),this.set_reg(A+1,B&255);else this.sp=B}store_flags(){let A=0;if(this.sf)A|=K.F_NEG;else A&=~K.F_NEG;if(this.zf)A|=K.F_ZERO;else A&=~K.F_ZERO;if(this.hf)A|=K.F_HCARRY;else A&=~K.F_HCARRY;if(this.pf)A|=K.F_PARITY;else A&=~K.F_PARITY;if(this.cf)A|=K.F_CARRY;else A&=~K.F_CARRY;return A|=K.F_UN1,A&=~K.F_UN3,A&=~K.F_UN5,A}retrieve_flags(A){this.sf=A&K.F_NEG?1:0,this.zf=A&K.F_ZERO?1:0,this.hf=A&K.F_HCARRY?1:0,this.pf=A&K.F_PARITY?1:0,this.cf=A&K.F_CARRY?1:0}bc(){return this.rp(0)}de(){return this.rp(2)}hl(){return this.rp(4)}b(){return this.reg(0)}c(){return this.reg(1)}d(){return this.reg(2)}e(){return this.reg(3)}h(){return this.reg(4)}l(){return this.reg(5)}a(){return this.reg(7)}set_b(A){this.set_reg(0,A)}set_c(A){this.set_reg(1,A)}set_d(A){this.set_reg(2,A)}set_e(A){this.set_reg(3,A)}set_h(A){this.set_reg(4,A)}set_l(A){this.set_reg(5,A)}set_a(A){this.set_reg(7,A)}next_pc_byte(){let A=this.memory_read_byte(this.pc);return this.pc=this.pc+1&65535,A}next_pc_word(){return this.next_pc_byte()|this.next_pc_byte()<<8}inr(A){let B=this.reg(A);B=B+1&255,this.set_reg(A,B),this.sf=(B&128)!=0?1:0,this.zf=B==0?1:0,this.hf=(B&15)==0?1:0,this.pf=this.parity_table[B]}dcr(A){let B=this.reg(A);B=B-1&255,this.set_reg(A,B),this.sf=(B&128)!=0?1:0,this.zf=B==0?1:0,this.hf=(B&15)!=15?1:0,this.pf=this.parity_table[B]}add_im8(A,B){let g=this.a(),Q=g+A+B,E=(g&136)>>1|(A&136)>>2|(Q&136)>>3;g=Q&255,this.sf=(g&128)!=0?1:0,this.zf=g==0?1:0,this.hf=this.half_carry_table[E&7]?1:0,this.pf=this.parity_table[g]?1:0,this.cf=(Q&256)!=0?1:0,this.set_a(g)}add(A,B){this.add_im8(this.reg(A),B)}sub_im8(A,B){let g=this.a(),Q=g-A-B&65535,E=(g&136)>>1|(A&136)>>2|(Q&136)>>3;g=Q&255,this.sf=(g&128)!=0?1:0,this.zf=g==0?1:0,this.hf=!this.sub_half_carry_table[E&7]?1:0,this.pf=this.parity_table[g]?1:0,this.cf=(Q&256)!=0?1:0,this.set_a(g)}sub(A,B){this.sub_im8(this.reg(A),B)}cmp_im8(A){let B=this.a();this.sub_im8(A,0),this.set_a(B)}cmp(A){this.cmp_im8(this.reg(A))}ana_im8(A){let B=this.a();this.hf=((B|A)&8)!=0?1:0,B&=A,this.sf=(B&128)!=0?1:0,this.zf=B==0?1:0,this.pf=this.parity_table[B]?1:0,this.cf=0,this.set_a(B)}ana(A){this.ana_im8(this.reg(A))}xra_im8(A){let B=this.a();B^=A,this.sf=(B&128)!=0?1:0,this.zf=B==0?1:0,this.hf=0,this.pf=this.parity_table[B],this.cf=0,this.set_a(B)}xra(A){this.xra_im8(this.reg(A))}ora_im8(A){let B=this.a();B|=A,this.sf=(B&128)!=0?1:0,this.zf=B==0?1:0,this.hf=0,this.pf=this.parity_table[B],this.cf=0,this.set_a(B)}ora(A){this.ora_im8(this.reg(A))}dad(A){let B=this.hl()+this.rp(A);this.cf=(B&65536)!=0?1:0,this.set_h(B>>8),this.set_l(B&255)}call(A){this.push(this.pc),this.pc=A}ret(){return this.pc=this.pop()}pop(){let A=this.memory_read_word(this.sp);return this.sp=this.sp+2&65535,A}push(A){this.sp=this.sp-2&65535,this.memory_write_word(this.sp,A)}rst(A){this.push(this.pc),this.pc=A}execute(A){let B=-1;switch(A){default:alert("Oops! Unhandled opcode "+A.toString(16));break;case 0:case 8:case 16:case 24:case 32:case 40:case 48:case 56:B=4;break;case 1:case 17:case 33:case 49:B=10,this.set_rp(A>>3,this.next_pc_word());break;case 2:case 18:B=7,this.memory_write_byte(this.rp(A>>3),this.a());break;case 3:case 19:case 35:case 51:{B=5;let g=A>>3;this.set_rp(g,this.rp(g)+1&65535);break}case 4:case 12:case 20:case 28:case 36:case 44:case 52:case 60:B=A!=52?5:10,this.inr(A>>3);break;case 5:case 13:case 21:case 29:case 37:case 45:case 53:case 61:B=A!=53?5:10,this.dcr(A>>3);break;case 6:case 14:case 22:case 30:case 38:case 46:case 54:case 62:B=A!=54?7:10,this.set_reg(A>>3,this.next_pc_byte());break;case 7:{B=4;let g=this.a();this.cf=(g&128)!=0?1:0,this.set_a(g<<1&255|this.cf);break}case 9:case 25:case 41:case 57:B=10,this.dad((A&48)>>3);break;case 10:case 26:{B=7;let g=(A&16)>>3;this.set_a(this.memory_read_byte(this.rp(g)));break}case 11:case 27:case 43:case 59:{B=5;let g=(A&48)>>3;this.set_rp(g,this.rp(g)-1&65535);break}case 15:B=4,this.cf=this.a()&1,this.set_a(this.a()>>1|this.cf<<7);break;case 23:{B=4;let g=this.cf;this.cf=(this.a()&128)!=0?1:0,this.set_a(this.a()<<1|g);break}case 31:{B=4;let g=this.cf;this.cf=this.a()&1,this.set_a(this.a()>>1|g<<7);break}case 34:{B=16;let g=this.next_pc_word();this.memory_write_byte(g,this.l()),this.memory_write_byte(g+1,this.h());break}case 39:{B=4;let g=this.cf,Q=0,E=this.a();if(this.hf||(E&15)>9)Q=6;if(this.cf||E>>4>9||E>>4>=9&&(E&15)>9)Q|=96,g=1;this.add_im8(Q,0),this.pf=this.parity_table[this.a()],this.cf=g;break}case 42:{B=16;let g=this.next_pc_word();this.regs[5]=this.memory_read_byte(g),this.regs[4]=this.memory_read_byte(g+1);break}case 47:B=4,this.set_a(this.a()^255);break;case 50:B=13,this.memory_write_byte(this.next_pc_word(),this.a());break;case 55:B=4,this.cf=1;break;case 58:B=13,this.set_a(this.memory_read_byte(this.next_pc_word()));break;case 63:B=4,this.cf=this.cf?0:1;break;case 64:case 65:case 66:case 67:case 68:case 69:case 70:case 71:case 72:case 73:case 74:case 75:case 76:case 77:case 78:case 79:case 80:case 81:case 82:case 83:case 84:case 85:case 86:case 87:case 88:case 89:case 90:case 91:case 92:case 93:case 94:case 95:case 96:case 97:case 98:case 99:case 100:case 101:case 102:case 103:case 104:case 105:case 106:case 107:case 108:case 109:case 110:case 111:case 112:case 113:case 114:case 115:case 116:case 117:case 119:case 120:case 121:case 122:case 123:case 124:case 125:case 126:case 127:{let g=A&7,Q=A>>3&7;B=g==6||Q==6?7:5,this.set_reg(Q,this.reg(g));break}case 118:B=4,this.pc=this.pc-1&65535;break;case 128:case 129:case 130:case 131:case 132:case 133:case 134:case 135:case 136:case 137:case 138:case 139:case 140:case 141:case 142:case 143:{let g=A&7;B=g!=6?4:7,this.add(g,A&8?this.cf:0);break}case 144:case 145:case 146:case 147:case 148:case 149:case 150:case 151:case 152:case 153:case 154:case 155:case 156:case 157:case 158:case 159:{let g=A&7;B=g!=6?4:7,this.sub(g,A&8?this.cf:0);break}case 160:case 161:case 162:case 163:case 164:case 165:case 166:case 167:{let g=A&7;B=g!=6?4:7,this.ana(g);break}case 168:case 169:case 170:case 171:case 172:case 173:case 174:case 175:{let g=A&7;B=g!=6?4:7,this.xra(g);break}case 176:case 177:case 178:case 179:case 180:case 181:case 182:case 183:{let g=A&7;B=g!=6?4:7,this.ora(g);break}case 184:case 185:case 186:case 187:case 188:case 189:case 190:case 191:{let g=A&7;B=g!=6?4:7,this.cmp(g);break}case 192:case 200:case 208:case 216:case 224:case 232:case 240:case 248:{let g=[this.zf,this.cf,this.pf,this.sf],Q=A>>4&3,E=(A&8)!=0?1:0;if(B=5,g[Q]==E)B=11,this.ret();break}case 193:case 209:case 225:case 241:{B=11;let g=(A&48)>>3,Q=this.pop();if(g!=6)this.set_rp(g,Q);else this.set_a(Q>>8),this.retrieve_flags(Q&255);break}case 194:case 202:case 210:case 218:case 226:case 234:case 242:case 250:{B=10;let g=[this.zf,this.cf,this.pf,this.sf],Q=A>>4&3,E=(A&8)!=0?1:0,D=this.next_pc_word();this.pc=g[Q]==E?D:this.pc;break}case 195:case 203:B=10,this.pc=this.next_pc_word();break;case 196:case 204:case 212:case 220:case 228:case 236:case 244:case 252:{let g=[this.zf,this.cf,this.pf,this.sf],Q=A>>4&3,E=(A&8)!=0?1:0,D=this.next_pc_word();if(B=11,g[Q]==E)B=17,this.call(D);break}case 197:case 213:case 229:case 245:{B=11;let g=(A&48)>>3,Q=g!=6?this.rp(g):this.a()<<8|this.store_flags();this.push(Q);break}case 198:B=7,this.add_im8(this.next_pc_byte(),0);break;case 199:case 207:case 215:case 223:case 231:case 239:case 247:case 255:this.rst(A&56),B=11;break;case 201:case 217:B=10,this.ret();break;case 205:case 221:case 237:case 253:B=17,this.call(this.next_pc_word());break;case 206:B=7,this.add_im8(this.next_pc_byte(),this.cf);break;case 211:B=10,this.io.output(this.next_pc_byte(),this.a());break;case 214:B=7,this.sub_im8(this.next_pc_byte(),0);break;case 219:B=10,this.set_a(this.io.input(this.next_pc_byte()));break;case 222:B=7,this.sub_im8(this.next_pc_byte(),this.cf);break;case 227:{B=18;let g=this.memory_read_word(this.sp);this.memory_write_word(this.sp,this.hl()),this.set_l(g&255),this.set_h(g>>8);break}case 230:B=7,this.ana_im8(this.next_pc_byte());break;case 233:B=5,this.pc=this.hl();break;case 235:{B=4;let g=this.l();this.set_l(this.e()),this.set_e(g);let Q=this.h();this.set_h(this.d()),this.set_d(Q);break}case 238:B=7,this.xra_im8(this.next_pc_byte());break;case 243:case 251:B=4,this.iff=(A&8)!=0?1:0,this.io.interrupt(this.iff);break;case 246:B=7,this.ora_im8(this.next_pc_byte());break;case 249:B=5,this.sp=this.hl();break;case 254:B=7,this.cmp_im8(this.next_pc_byte());break}return B}instruction(){return this.execute(this.next_pc_byte())}jump(A){this.pc=A&65535}}var b=function(A,B){return(A[B]&255)<<8|A[B+1]&255},q=(A)=>A.reduce((B,g)=>B+String.fromCharCode(g),""),wA=(A)=>q(A.slice(0,6))==="#!rk86",n=(A)=>{try{if(!A)return{ok:!1};if(A instanceof Uint8Array)A=Array.from(A);let B=q(A);return{ok:!0,json:JSON.parse(B)}}catch{return{ok:!1}}},PA=function(A){let B=A.split(`
2
+ `).filter((Q)=>Q.trim().length).filter((Q)=>!Q.startsWith(";")&&!Q.startsWith("#")),g=[];for(let Q of B){let D=Q.slice(5).trim().split(" ").map((P)=>parseInt(P,16));g.push(...D)}return g},CA=(A)=>{let B=A.match(".*\\.(.*)$");return B?B[1]:""},W=(A,B)=>{let g={};g.name=A.split("/").slice(-1)[0];let Q=B;if(wA(Q)){let D=q(Q);if(Q=PA(D),g={...g,...MA(D)},g.start!=null)g.start=parseInt(g.start,16);if(g.entry!=null)g.entry=parseInt(g.entry,16)}if(Q.length>65536)throw Error(`ошибка: длина файла [${g.name}] ${Q.length} превышает 65556`);let E=CA(g.name);if(E==="bin"||E===""){if(g.size=Q.length,g.start==null)g.start=g.name.match(/^mon/)?65536-g.size:0;if(g.end=g.start+g.size-1,g.image=Q,g.entry==null)g.entry=g.start}else{let D=0;if((Q[D]&255)==230)++D;if(g.start=b(Q,D),g.end=b(Q,D+2),D+=4,g.size=g.end-g.start+1,g.image=Q.slice(D,D+g.size),g.entry=g.entry!=null?g.entry:g.start,g.name=="PVO.GAM")g.entry=13312}return g};function MA(A){let B={};return[...A.matchAll(/!([^ =\t\n\r]+?)=([^ \t\r\n]+)/g)].map((g)=>g.slice(1)).reduce((g,[Q,E])=>(g[Q]=E,g),B)}function r(){return"data:image/bmp;base64,Qk0+IAAAAAAAAD4AAAAoAAAACAAAAAAIAAABAAEAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAGAAAABgAAAB+AAAAfgAAABgAAAAYAAAAAAAAAAAAAAABAAAAAQAAAA8AAAAJAAAACQAAAAAAAAAAAAAAAQAAAD8AAAAqAAAAKgAAACoAAAAqAAAAAAAAAAAAAAAAAAAADgAAAAEAAAAHAAAAAQAAAA4AAAAAAAAAAAAAAAAAAAAfAAAAFQAAABUAAAAVAAAAFQAAAAAAAAAAAAAAAAAAAA4AAAABAAAAAgAAAAkAAAAGAAAAAAAAAAAAAAAAAAAAGQAAABUAAAAZAAAAEQAAABEAAAAAAAAAAAAAAAAAAAAOAAAACQAAAA4AAAAIAAAACAAAAAAAAAAAAAAAAAAAAA4AAAAJAAAADgAAAAkAAAAOAAAAAAAAAAAAAAAAAAAAFQAAABUAAAAOAAAAFQAAABUAAAAAAAAAAAAAAAAAAAAOAAAAAQAAAAcAAAAJAAAACQAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAfAAAAAAAAAAAAAAAAAAAABwAAAAgAAAAIAAAACAAAAAcAAAAAAAAAAAAAAAgAAAAIAAAACAAAAA4AAAAJAAAADgAAAAAAAAAAAAAAAAAAAAkAAAAFAAAABwAAAAkAAAAHAAAAAAAAAAAAAAAAAAAACQAAAAkAAAAJAAAACQAAAA8AAAAAAAAAAAAAAAAAAAAGAAAACQAAAAkAAAAJAAAABgAAAAAAAAAAAAAAAAAAAAkAAAAJAAAADwAAAAkAAAAJAAAAAAAAAAAAAAAAAAAAEQAAABUAAAAVAAAAGwAAABEAAAAAAAAAAAAAAAAAAAAJAAAACQAAAAkAAAAFAAAAAwAAAAAAAAAAAAAAAAAAAAkAAAAKAAAADAAAAAoAAAAJAAAAAAAAAAAAAAAAAAAACQAAAA0AAAALAAAACQAAAAkAAAAAAAAABgAAAAAAAAAJAAAADQAAAAsAAAAJAAAACQAAAAAAAAAAAAAAAAAAAAkAAAAJAAAABgAAAAYAAAAJAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAIAAAACAAAAA8AAAAAAAAAAAAAAAQAAAAEAAAADgAAABUAAAAOAAAABAAAAAAAAAAAAAAAAAAAAAcAAAAIAAAADgAAAAkAAAAGAAAAAAAAAAAAAAAAAAAADwAAAAEAAAAHAAAACQAAAAYAAAAAAAAAAAAAAAEAAAAfAAAAEgAAABIAAAASAAAAEgAAAAAAAAAAAAAAAAAAAA4AAAAJAAAADgAAAAgAAAAHAAAAAAAAAAAAAAAAAAAABgAAAAkAAAAHAAAAAQAAAA4AAAAAAAAAAAAAAAAAAAASAAAAFQAAAB0AAAAVAAAAEgAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAHgAAAD8AAAAeAAAADAAAAAgAAAAAAAAAAQAAAAMAAAAPAAAADAAAAAgAAAAAAAAAAAAAAAAAAAARAAAACAAAAAgAAAAEAAAACAAAAAgAAAAQAAAAAAAAAAgAAAAIAAAACAAAAAAAAAAIAAAACAAAAAgAAAAAAAAAAQAAAAIAAAACAAAABAAAAAIAAAACAAAAAQAAAAAAAAAPAAAACAAAAAYAAAABAAAADwAAAAAAAAAAAAAAAAAAAA4AAAABAAAABwAAAAkAAAAJAAAAAAAAAAAAAAAAAAAAEQAAAAoAAAACAAAACgAAABEAAAAAAAAAAAAAAAAAAAAKAAAAFQAAABUAAAARAAAAEQAAAAAAAAAAAAAAAAAAAAQAAAAKAAAAEQAAABEAAAARAAAAAAAAAAAAAAAAAAAADgAAABEAAAARAAAAEQAAABEAAAAAAAAAAAAAAAAAAAAGAAAACQAAAAgAAAAIAAAAHAAAAAgAAAAIAAAAAAAAAA4AAAABAAAABgAAAAgAAAAHAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAIAAAACQAAAA4AAAAAAAAAAAAAAAAAAAABAAAABwAAAAkAAAAJAAAABwAAAAAAAAAAAAAAAAAAAAgAAAAOAAAACQAAAAkAAAAOAAAAAAAAAAAAAAAAAAAABgAAAAkAAAAJAAAACQAAAAYAAAAAAAAAAAAAAAAAAAAJAAAACQAAAAkAAAAJAAAADgAAAAAAAAAAAAAAAAAAABUAAAAVAAAAFQAAABUAAAAaAAAAAAAAAAAAAAAAAAAABwAAAAIAAAACAAAAAgAAAAIAAAACAAAABgAAAAAAAAAJAAAACgAAAAwAAAAKAAAACQAAAAgAAAAIAAAAAAAAAAYAAAAJAAAAAQAAAAEAAAABAAAAAAAAAAEAAAAAAAAABwAAAAIAAAACAAAAAgAAAAYAAAAAAAAAAgAAAAAAAAAJAAAACQAAAAkAAAAJAAAADgAAAAgAAAAIAAAAAAAAAA4AAAABAAAABwAAAAkAAAAHAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAIAAAAHAAAAAgAAAAJAAAABgAAAAAAAAAHAAAACAAAAA4AAAAJAAAABgAAAAAAAAAAAAAAAAAAAAcAAAAJAAAACQAAAAkAAAAHAAAAAQAAAAEAAAAAAAAABwAAAAgAAAAIAAAACAAAAAcAAAAAAAAAAAAAAAAAAAAOAAAACQAAAAkAAAAJAAAADgAAAAgAAAAIAAAAAAAAAA0AAAASAAAAEgAAABIAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAEAAAAAAAAAAEAAAAAAAAAAQAAAACAAAAAQAAABEAAAAOAAAAAAAAAAgAAAAEAAAAAgAAAAEAAAACAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAACAAAABAAAAAgAAAAQAAAACAAAAAQAAAACAAAAAAAAAAgAAAAEAAAADAAAAAwAAAAAAAAADAAAAAwAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAcAAAAAgAAAAEAAAAPAAAAEQAAABEAAAAOAAAAAAAAAA4AAAARAAAAEQAAAA4AAAARAAAAEQAAAA4AAAAAAAAACAAAAAgAAAAIAAAABAAAAAIAAAABAAAAHwAAAAAAAAAOAAAAEQAAABEAAAAeAAAAEAAAAAgAAAAHAAAAAAAAAA4AAAARAAAAAQAAAAEAAAAeAAAAEAAAAB8AAAAAAAAAAgAAAAIAAAAfAAAAEgAAAAoAAAAGAAAAAgAAAAAAAAAOAAAAEQAAAAEAAAAGAAAAAgAAAAEAAAAfAAAAAAAAAB8AAAAQAAAACAAAAAYAAAABAAAAEQAAAA4AAAAAAAAADgAAAAQAAAAEAAAABAAAAAQAAAAMAAAABAAAAAAAAAAOAAAAEQAAABkAAAAVAAAAEwAAABEAAAAOAAAAAAAAAAAAAAAQAAAACAAAAAQAAAACAAAAAQAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAHwAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAABUAAAAOAAAAFQAAAAQAAAAAAAAAAAAAAAgAAAAEAAAAAgAAAAIAAAACAAAABAAAAAgAAAAAAAAAAgAAAAQAAAAIAAAACAAAAAgAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAgAAAAYAAAAGAAAAAAAAAA0AAAASAAAAFQAAAAwAAAAKAAAACgAAAAQAAAAAAAAAAwAAABMAAAAIAAAABAAAAAIAAAAZAAAAGAAAAAAAAAAEAAAAHgAAAAUAAAAOAAAAFAAAAA8AAAAEAAAAAAAAAAoAAAAKAAAAHwAAAAoAAAAfAAAACgAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAKAAAACgAAAAAAAAAEAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAABQAAAD0AAAAnAAAAIAAAACAAAAA4AAAABAAAAAwAAAAdAAAAPwAAAD8AAAAdAAAADAAAAAQAAAAAAAAAAAAAAAAAAAA/AAAAPwAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAABwAAAAcAAAAHAAAABwAAAD8AAAA/AAAAPwAAAD8AAAA4AAAAOAAAADgAAAA4AAAAPwAAAD8AAAA/AAAAPwAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAOAAAADgAAAA4AAAAPwAAAD8AAAA/AAAAPwAAADgAAAA4AAAAOAAAADgAAAAHAAAABwAAAAcAAAAHAAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAeAAAAPwAAAAwAAAAMAAAADAAAAAwAAAAMAAAACAAAAAwAAAAuAAAAPwAAAD8AAAAuAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAA/AAAAHgAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAASAAAADAAAAAwAAAAtAAAAPwAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAABwAAAAcAAAAHAAAAPwAAAD8AAAA/AAAAPwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAADgAAAA4AAAAOAAAADgAAAAHAAAABwAAAAcAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAPwAAAD8AAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAHAAAABwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAAAAAAAAQAAAAEAAAABAAAAHwAAABEAAAARAAAAEQAAAAAAAAABAAAAHwAAABUAAAAVAAAAFQAAABUAAAAVAAAAAAAAAA4AAAARAAAAAQAAAAcAAAABAAAAEQAAAA4AAAAAAAAAHwAAABUAAAAVAAAAFQAAABUAAAAVAAAAEQAAAAAAAAAOAAAAEQAAAAEAAAAGAAAAEQAAABEAAAAOAAAAAAAAABkAAAAVAAAAFQAAABkAAAARAAAAEQAAABEAAAAAAAAAHgAAABEAAAARAAAAHgAAABAAAAAQAAAAEAAAAAAAAAAeAAAAEQAAABEAAAAeAAAAEQAAABEAAAAeAAAAAAAAABEAAAAVAAAAFQAAAA4AAAAVAAAAFQAAABEAAAAAAAAAEAAAAAgAAAAEAAAACgAAABEAAAARAAAAEQAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAfAAAAAAAAAA4AAAARAAAAEAAAABAAAAAQAAAAEQAAAA4AAAAAAAAAEAAAABAAAAAQAAAAHgAAABEAAAARAAAAHgAAAAAAAAARAAAACQAAAAUAAAAPAAAAEQAAABEAAAAPAAAAAAAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAAB8AAAAAAAAADgAAABEAAAARAAAAEQAAABEAAAARAAAADgAAAAAAAAARAAAAEQAAABEAAAAfAAAAEQAAABEAAAARAAAAAAAAABEAAAARAAAAEQAAABUAAAAVAAAAGwAAABEAAAAAAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAABwAAAAAAAAARAAAAEgAAABQAAAAYAAAAFAAAABIAAAARAAAAAAAAABEAAAARAAAAGQAAABUAAAATAAAAEQAAABUAAAAAAAAAEQAAABEAAAAZAAAAFQAAABMAAAARAAAAEQAAAAAAAAARAAAAEQAAAAoAAAAEAAAACgAAABEAAAARAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEQAAAB8AAAAAAAAABAAAAAQAAAAfAAAAFQAAABUAAAAfAAAABAAAAAAAAAAfAAAAEAAAABAAAAAeAAAAEAAAABAAAAAfAAAAAAAAABEAAAAfAAAACgAAAAoAAAAKAAAACgAAAAYAAAAAAAAAAQAAAB8AAAASAAAAEgAAABIAAAASAAAAEgAAAAAAAAAeAAAAEQAAABEAAAAeAAAAEAAAABAAAAAfAAAAAAAAABEAAAARAAAAHwAAABEAAAARAAAACgAAAAQAAAAAAAAAEgAAABUAAAAVAAAAHQAAABUAAAAVAAAAEgAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAA4AAAAAAAAADgAAAAIAAAACAAAAAgAAAAIAAAACAAAADgAAAAAAAAAAAAAAAQAAAAIAAAAEAAAACAAAABAAAAAAAAAAAAAAAA4AAAAIAAAACAAAAAgAAAAIAAAACAAAAA4AAAAAAAAAHwAAABAAAAAIAAAADgAAAAIAAAABAAAAHwAAAAAAAAAEAAAABAAAAAQAAAAEAAAACgAAABEAAAARAAAAAAAAABEAAAARAAAACgAAAAQAAAAKAAAAEQAAABEAAAAAAAAACgAAABUAAAAVAAAAFQAAABEAAAARAAAAEQAAAAAAAAAEAAAABAAAAAoAAAAKAAAAEQAAABEAAAARAAAAAAAAAA4AAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAHwAAAAAAAAAOAAAAEQAAAAEAAAAOAAAAEAAAABEAAAAOAAAAAAAAABEAAAASAAAAFAAAAB4AAAARAAAAEQAAAB4AAAAAAAAADQAAABIAAAAVAAAAEQAAABEAAAARAAAADgAAAAAAAAAQAAAAEAAAABAAAAAeAAAAEQAAABEAAAAeAAAAAAAAAA4AAAARAAAAEQAAABEAAAARAAAAEQAAAA4AAAAAAAAAEQAAABEAAAATAAAAFQAAABkAAAARAAAAEQAAAAAAAAARAAAAEQAAABEAAAAVAAAAFQAAABsAAAARAAAAAAAAAB8AAAARAAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAEQAAABIAAAAUAAAAGAAAABQAAAASAAAAEQAAAAAAAAAOAAAAEQAAABEAAAABAAAAAQAAAAEAAAABAAAAAAAAAA4AAAAEAAAABAAAAAQAAAAEAAAABAAAAA4AAAAAAAAAEQAAABEAAAARAAAAHwAAABEAAAARAAAAEQAAAAAAAAAPAAAAEQAAABMAAAAQAAAAEAAAABEAAAAOAAAAAAAAABAAAAAQAAAAEAAAAB4AAAAQAAAAEAAAAB8AAAAAAAAAHwAAABAAAAAQAAAAHgAAABAAAAAQAAAAHwAAAAAAAAAeAAAACQAAAAkAAAAJAAAACQAAAAkAAAAeAAAAAAAAAA4AAAARAAAAEAAAABAAAAAQAAAAEQAAAA4AAAAAAAAAHgAAABEAAAARAAAAHgAAABEAAAARAAAAHgAAAAAAAAARAAAAEQAAAB8AAAARAAAAEQAAAAoAAAAEAAAAAAAAAA4AAAAQAAAAFwAAABUAAAATAAAAEQAAAA4AAAAAAAAABAAAAAAAAAAEAAAAAgAAAAEAAAARAAAADgAAAAAAAAAIAAAABAAAAAIAAAABAAAAAgAAAAQAAAAIAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAIAAAAEAAAAAgAAAAEAAAAAgAAAAAAAAAIAAAABAAAAAwAAAAMAAAAAAAAAAwAAAAMAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAHAAAAAIAAAABAAAADwAAABEAAAARAAAADgAAAAAAAAAOAAAAEQAAABEAAAAOAAAAEQAAABEAAAAOAAAAAAAAAAgAAAAIAAAACAAAAAQAAAACAAAAAQAAAB8AAAAAAAAADgAAABEAAAARAAAAHgAAABAAAAAIAAAABwAAAAAAAAAOAAAAEQAAAAEAAAABAAAAHgAAABAAAAAfAAAAAAAAAAIAAAACAAAAHwAAABIAAAAKAAAABgAAAAIAAAAAAAAADgAAABEAAAABAAAABgAAAAIAAAABAAAAHwAAAAAAAAAfAAAAEAAAAAgAAAAGAAAAAQAAABEAAAAOAAAAAAAAAA4AAAAEAAAABAAAAAQAAAAEAAAADAAAAAQAAAAAAAAADgAAABEAAAAZAAAAFQAAABMAAAARAAAADgAAAAAAAAAAAAAAEAAAAAgAAAAEAAAAAgAAAAEAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAB8AAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAVAAAADgAAABUAAAAEAAAAAAAAAAAAAAAIAAAABAAAAAIAAAACAAAAAgAAAAQAAAAIAAAAAAAAAAIAAAAEAAAACAAAAAgAAAAIAAAABAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAIAAAAGAAAABgAAAAAAAAANAAAAEgAAABUAAAAMAAAACgAAAAoAAAAEAAAAAAAAAAMAAAATAAAACAAAAAQAAAACAAAAGQAAABgAAAAAAAAABAAAAB4AAAAFAAAADgAAABQAAAAPAAAABAAAAAAAAAAKAAAACgAAAB8AAAAKAAAAHwAAAAoAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACgAAAAoAAAAAAAAABAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAUAAAA9AAAAJwAAACAAAAAgAAAAOAAAAAQAAAAMAAAAHQAAAD8AAAA/AAAAHQAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAPwAAAD8AAAAAAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAAcAAAAHAAAABwAAAAcAAAA/AAAAPwAAAD8AAAA/AAAAOAAAADgAAAA4AAAAOAAAAD8AAAA/AAAAPwAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAA4AAAAOAAAAD8AAAA/AAAAPwAAAD8AAAA4AAAAOAAAADgAAAA4AAAABwAAAAcAAAAHAAAABwAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAHgAAAD8AAAAMAAAADAAAAAwAAAAMAAAADAAAAAgAAAAMAAAALgAAAD8AAAA/AAAALgAAAAwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAPwAAAB4AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAEgAAAAwAAAAMAAAALQAAAD8AAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAcAAAAHAAAABwAAAD8AAAA/AAAAPwAAAD8AAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAA4AAAAOAAAADgAAAA4AAAABwAAAAcAAAAHAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAD8AAAA/AAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAHAAAABwAAAAcAAAAHAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="}class Z{state;modifiers;keydown=(A)=>{if(A==="ShiftLeft"||A==="ShiftRight")this.modifiers&=~t;if(A==="ControlLeft")this.modifiers&=~l;if(A==="F10")this.modifiers&=~_;let B=Z.key_table[A];if(B)this.state[B[0]]&=~B[1]};keyup=(A)=>{if(A==="ShiftLeft"||A==="ShiftRight")this.modifiers|=t;if(A==="ControlLeft")this.modifiers|=l;if(A==="F10")this.modifiers|=_;let B=Z.key_table[A];if(B)this.state[B[0]]|=B[1]};onkeydown=(A)=>this.keydown(A);onkeyup=(A)=>this.keyup(A);constructor(){this.reset()}reset(){this.state=[255,255,255,255,255,255,255,255],this.modifiers=255}export(){let A=(B)=>"0x"+G(B);return{state:this.state.map(A),modifiers:A(this.modifiers)}}import(A){this.state=A.state.map(j),this.modifiers=j(A.modifiers)}static key_table={F8:[0,1],F9:[0,2],F5:[0,4],F1:[0,8],F2:[0,16],F3:[0,32],F4:[0,64],Tab:[1,1],Backquote:[1,2],Enter:[1,4],Backspace:[1,8],ArrowLeft:[1,16],ArrowUp:[1,32],ArrowRight:[1,64],ArrowDown:[1,128],Digit0:[2,1],Digit1:[2,2],Digit2:[2,4],Digit3:[2,8],Digit4:[2,16],Digit5:[2,32],Digit6:[2,64],Digit7:[2,128],Digit8:[3,1],Digit9:[3,2],F6:[3,4],Semicolon:[3,8],Comma:[3,16],Minus:[3,32],Period:[3,64],Slash:[3,128],F7:[4,1],KeyA:[4,2],KeyB:[4,4],KeyC:[4,8],KeyD:[4,16],KeyE:[4,32],KeyF:[4,64],KeyG:[4,128],KeyH:[5,1],KeyI:[5,2],KeyJ:[5,4],KeyK:[5,8],KeyL:[5,16],KeyM:[5,32],KeyN:[5,64],KeyO:[5,128],KeyP:[6,1],KeyQ:[6,2],KeyR:[6,4],KeyS:[6,8],KeyT:[6,16],KeyU:[6,32],KeyV:[6,64],KeyW:[6,128],KeyX:[7,1],KeyY:[7,2],KeyZ:[7,4],BracketLeft:[7,8],Backslash:[7,16],BracketRight:[7,32],Quote:[7,64],Space:[7,128]}}var t=32,l=64,_=128;function KA(A){if(typeof A==="number")return[A];if(Array.isArray(A))return A;return A.split(/[,\s]+/).map((B)=>B.trim()).filter(Boolean)}function o(A){let B=[];return A.forEach(({keys:g,duration:Q,action:E})=>{let D=KA(g);if(E==="press")D.forEach((P)=>{B.push({keys:[P],duration:Q,action:"down"}),B.push({keys:[P],duration:Q,action:"up"})});else B.push({keys:D,duration:Q,action:E})}),B}function h(A,B=16){let g={};for(let Q=0;Q<A.length;Q+=B)g[":"+X(Q).toString()]=y(A.slice(Q,Q+B));return g}function p(A){let B=[];for(let[g,Q]of Object.entries(A)){let E=parseInt(g.slice(1),16),D=Q.split(" ").map((P)=>parseInt(P,16));for(let P=0;P<D.length;P++)B[E+P]=D[P]}return B}class ${buf=[];update_ruslat=()=>{};machine;vg75_c001_00_cmd=0;video_screen_size_x_buf=0;video_screen_size_y_buf=0;ik57_e008_80_cmd=0;ik57_ff=0;vg75_c001_80_cmd=0;cursor_x_buf=0;cursor_y_buf=0;vg75_c001_60_cmd=0;tape_8002_as_output=0;video_memory_base_buf=0;video_memory_size_buf=0;video_memory_base=0;video_memory_size=0;video_screen_size_x=0;video_screen_size_y=0;video_screen_cursor_x=0;video_screen_cursor_y=0;last_access_address=0;last_access_operation=void 0;tracer=null;constructor(A){this.machine=A,this.init(),this.invalidate_access_variables()}init(){this.buf=Array(65536).fill(0),this.vg75_c001_00_cmd=0,this.video_screen_size_x_buf=0,this.video_screen_size_y_buf=0,this.ik57_e008_80_cmd=0,this.ik57_ff=0,this.vg75_c001_80_cmd=0,this.cursor_x_buf=0,this.cursor_y_buf=0,this.vg75_c001_60_cmd=0,this.tape_8002_as_output=0,this.video_memory_base_buf=0,this.video_memory_size_buf=0,this.video_memory_base=0,this.video_memory_size=0,this.video_screen_size_x=0,this.video_screen_size_y=0,this.video_screen_cursor_x=0,this.video_screen_cursor_y=0}zero_ram(){for(let A=0;A<32768;++A)this.buf[A]=0}snapshot(A,B){return this.buf.slice(A,A+B)}export(){let A=(B)=>"0x"+X(B);return{vg75_c001_00_cmd:this.vg75_c001_00_cmd,video_screen_size_x_buf:this.video_screen_size_x_buf,video_screen_size_y_buf:this.video_screen_size_y_buf,vg75_c001_80_cmd:this.vg75_c001_80_cmd,cursor_x_buf:this.cursor_x_buf,cursor_y_buf:this.cursor_y_buf,vg75_c001_60_cmd:this.vg75_c001_60_cmd,ik57_e008_80_cmd:this.ik57_e008_80_cmd,ik57_ff:this.ik57_ff,tape_8002_as_output:this.tape_8002_as_output,video_memory_base_buf:A(this.video_memory_base_buf),video_memory_size_buf:A(this.video_memory_size_buf),video_memory_base:A(this.video_memory_base),video_memory_size:A(this.video_memory_size),video_screen_size_x:this.video_screen_size_x,video_screen_size_y:this.video_screen_size_y,video_screen_cursor_x:this.video_screen_cursor_x,video_screen_cursor_y:this.video_screen_cursor_y,last_access_address:A(this.last_access_address),last_access_operation:this.last_access_operation,memory:h(this.buf)}}import=(A)=>{let B=j;this.vg75_c001_00_cmd=A.vg75_c001_00_cmd,this.video_screen_size_x_buf=A.video_screen_size_x_buf,this.video_screen_size_y_buf=A.video_screen_size_y_buf,this.vg75_c001_80_cmd=A.vg75_c001_80_cmd,this.cursor_x_buf=A.cursor_x_buf,this.cursor_y_buf=A.cursor_y_buf,this.vg75_c001_60_cmd=A.vg75_c001_60_cmd,this.ik57_e008_80_cmd=A.ik57_e008_80_cmd,this.ik57_ff=A.ik57_ff??0,this.tape_8002_as_output=A.tape_8002_as_output,this.video_memory_base_buf=B(A.video_memory_base_buf),this.video_memory_size_buf=B(A.video_memory_size_buf),this.video_memory_base=B(A.video_memory_base),this.video_memory_size=B(A.video_memory_size),this.video_screen_size_x=A.video_screen_size_x,this.video_screen_size_y=A.video_screen_size_y,this.video_screen_cursor_x=A.video_screen_cursor_x,this.video_screen_cursor_y=A.video_screen_cursor_y,this.last_access_address=B(A.last_access_address),this.last_access_operation=A.last_access_operation,this.buf=p(A.memory)};invalidate_access_variables(){this.last_access_address=0,this.last_access_operation=void 0}length(){return 65536}read_raw(A){let B=A&65535;return this.buf[B]&255}read(A){let B=A&65535;this.last_access_address=B,this.last_access_operation="read",this.tracer?.("read",B);let g=B&57347,Q=B&57345;if(g===32770)return this.machine.keyboard.modifiers;if(g===32769){let E=this.machine.keyboard.state,D=255,P=~this.buf[32768];for(let w=0;w<8;w++)if(1<<w&P)D&=E[w];return D}if(Q===49153){let E=this.machine.runner.total_ticks,D=35600,P=3560;return(E%35600>=32040?32:0)|(this.machine.screen.light_pen_active?16:0)}if(Q===49152){if(this.vg75_c001_60_cmd===1)return this.vg75_c001_60_cmd=2,this.machine.screen.light_pen_x;if(this.vg75_c001_60_cmd===2)return this.vg75_c001_60_cmd=0,this.machine.screen.light_pen_y;return 0}return this.buf[B]}write_raw(A,B){let g=A&65535,Q=B&255;this.buf[g]=Q}write=(A,B)=>{let g=A&65535,Q=B&255;if(this.last_access_address=g,this.last_access_operation="write",this.tracer?.("write",g),g<63488)this.buf[g]=Q;let E=g&57347,D=g&57345,P=g&57359;if(E===32771){if(Q&128);else{let w=Q>>1&3,I=Q&1;if(w===3)this.set_ruslat(I)}return}if(D===49153&&Q===39)return;if(D===49153&&Q===224)return;if(D===49153&&Q===128){this.vg75_c001_80_cmd=1;return}if(D===49152&&this.vg75_c001_80_cmd===1){this.vg75_c001_80_cmd+=1,this.cursor_x_buf=Q+1;return}if(D===49152&&this.vg75_c001_80_cmd===2){this.cursor_y_buf=Q+1,this.machine.screen.set_cursor(this.cursor_x_buf-1,this.cursor_y_buf-1),this.video_screen_cursor_x=this.cursor_x_buf,this.video_screen_cursor_y=this.cursor_y_buf,this.vg75_c001_80_cmd=0;return}if(D===49153&&Q===96){if(this.machine.screen.light_pen_active)this.vg75_c001_60_cmd=1;return}if(D===49153&&Q===0){this.vg75_c001_00_cmd=1;return}if(D===49152&&this.vg75_c001_00_cmd===1){this.video_screen_size_x_buf=(Q&127)+1,this.vg75_c001_00_cmd+=1;return}if(D===49152&&this.vg75_c001_00_cmd===2){this.video_screen_size_y_buf=(Q&63)+1,this.vg75_c001_00_cmd+=1;return}if(D===49152&&this.vg75_c001_00_cmd===3){this.machine.screen.set_char_height((Q&15)+1),this.machine.screen.underline_scanline=Q>>4&15,this.vg75_c001_00_cmd+=1;return}if(D===49152&&this.vg75_c001_00_cmd===4){if(this.vg75_c001_00_cmd=0,this.video_screen_size_x_buf&&this.video_screen_size_y_buf)this.video_screen_size_x=this.video_screen_size_x_buf,this.video_screen_size_y=this.video_screen_size_y_buf,this.machine.screen.set_geometry(this.video_screen_size_x,this.video_screen_size_y);this.machine.screen.transparent_attr=(Q&64)===0;return}if(P===57352&&Q===128){this.ik57_e008_80_cmd=1,this.ik57_ff=0,this.tape_8002_as_output=1;return}if(P===57348&&this.ik57_e008_80_cmd===1){this.video_memory_base_buf=Q,this.ik57_e008_80_cmd+=1;return}if(P===57348&&this.ik57_e008_80_cmd===2){this.video_memory_base_buf|=Q<<8,this.ik57_e008_80_cmd+=1;return}if(P===57349&&this.ik57_e008_80_cmd===3){this.video_memory_size_buf=Q,this.ik57_e008_80_cmd+=1;return}if(P===57349&&this.ik57_e008_80_cmd===4){this.video_memory_size_buf=((this.video_memory_size_buf|Q<<8)&16383)+1,this.ik57_e008_80_cmd=0,this.video_memory_base=this.video_memory_base_buf,this.video_memory_size=this.video_memory_size_buf,this.machine.screen.set_video_memory(this.video_memory_base);return}if(P===57352&&Q===164){this.tape_8002_as_output=0;return}if(P===57348&&this.ik57_e008_80_cmd===0){if(this.ik57_ff===0)this.video_memory_base_buf=this.video_memory_base&65280|Q,this.ik57_ff=1;else this.video_memory_base=this.video_memory_base_buf&255|Q<<8,this.video_memory_base_buf=this.video_memory_base,this.machine.screen.set_video_memory(this.video_memory_base),this.ik57_ff=0;return}if(P===57349&&this.ik57_e008_80_cmd===0){if(this.ik57_ff===0)this.video_memory_size_buf=Q,this.ik57_ff=1;else this.video_memory_size=((this.video_memory_size_buf|Q<<8)&16383)+1,this.video_memory_size_buf=this.video_memory_size,this.ik57_ff=0;return}if(E===32770){if(this.tape_8002_as_output)this.tape_write_bit(Q&1);return}};tape_write_bit(A){this.machine.tape.write_bit(A)}set_ruslat(A){if(this.update_ruslat)this.update_ruslat(A)}load_file(A){for(let B=A.start;B<=A.end;++B)this.write_raw(B,A.image[B-A.start])}}var d=["mono","color1","color2","color3"];var s="color1";function c(A,B){let g=(B&1)!==0,Q=(B&4)!==0,E=(B&8)!==0;switch(A){case"color1":{let D=(E?255:0)|(Q?65280:0)|(g?16711680:0);return D===0?12632256:D}case"color2":return(Q?0:16711680)|(E?0:65280)|(g?0:255);case"color3":return(Q?0:255)|(E?0:65280)|(g?0:16711680);case"mono":default:return 12632256}}function a(A){return A!=="color3"}function V(A){return"#"+A.toString(16).padStart(6,"0")}class m{paused=!1;turbo=!1;hardware_id_enabled=!1;stc_streak=0;tracer=null;last_instructions=[];previous_batch_time=0;total_ticks=0;last_iff_raise_ticks=0;last_iff=0;sound=null;sound_factory;instructions_per_millisecond=0;ticks_per_millisecond=0;FREQ=1780000;TICK_PER_MS;execute_timer;machine;constructor(A){this.machine=A,this.TICK_PER_MS=this.FREQ/100,this.machine.io.interrupt=(B)=>this.interrupt(B),this.machine.cpu.jump(63488)}interrupt(A){if(!this.sound||this.turbo)return;if(this.last_iff==A)return;if(this.last_iff==0&&A==1)this.last_iff_raise_ticks=this.total_ticks;if(this.last_iff==1&&A==0){let B=this.total_ticks-this.last_iff_raise_ticks,g=this.FREQ/(B*2),Q=1/g;this.sound.play(g,Q)}this.last_iff=A}init_sound(A){if(A&&this.sound==null&&this.sound_factory)this.sound=this.sound_factory(),this.machine.log("звук включен");else if(!A)this.sound=null,this.machine.log("звук выключен")}execute(A={}){let{terminate_address:B,on_terminate:g,exit_on_halt:Q,on_halt:E,on_batch_complete:D}=A;if(A.turbo!==void 0)this.turbo=A.turbo;clearTimeout(this.execute_timer);let P=this.turbo,w=P?100:1;for(let I=0;I<w;I++){if(this.paused)break;let N=0,R=0;while(N<this.TICK_PER_MS){if(this.tracer){if(this.tracer("before"),this.paused)break}if(this.last_instructions.push(this.machine.cpu.pc),this.last_instructions.length>5)this.last_instructions.shift();let O=this.machine.cpu.pc;this.machine.memory.invalidate_access_variables();let C=this.machine.cpu.instruction();if(N+=C,this.total_ticks+=C,this.hardware_id_enabled)if(this.machine.memory.read_raw(O)===55){if(++this.stc_streak>=4)this.stc_streak=0,this.fire_hardware_id()}else this.stc_streak=0;if(this.tracer){if(this.tracer("after"),this.paused)break}if(this.machine.ui.visualizer_visible&&this.machine.ui.on_visualizer_hit)this.machine.ui.on_visualizer_hit(this.machine.memory.read_raw(this.machine.cpu.pc));if(R+=1,B!==void 0&&this.machine.cpu.pc===B){g?.();return}if(this.machine.memory.read_raw(this.machine.cpu.pc)===118){if(Q){g?.();return}if(E&&E())return}}let f=performance.now(),z=f-this.previous_batch_time;this.previous_batch_time=f,this.instructions_per_millisecond=R/z,this.ticks_per_millisecond=N/z,this.machine.screen.tick_cursor(this.total_ticks,this.FREQ*(this.machine.screen.cursor_rate/1000)),D?.()}this.execute_timer=setTimeout(()=>this.execute(A),P?0:10)}pause(){this.paused=!0}resume(){this.paused=!1}reset(){this.machine.cpu.jump(63488),this.machine.keyboard.reset()}fire_hardware_id(){let A=d.indexOf(this.machine.screen.color_mode);this.machine.cpu.set_a(1),this.machine.cpu.set_b(A<0?0:A),this.machine.cpu.set_c(this.turbo?1:0),this.machine.cpu.cf=0}}class k{static#A=40;machine;cursor_rate;scale_x;scale_y;width;height;cursor_state;cursor_x;cursor_y;light_pen_x;light_pen_y;light_pen_active;video_memory_base=0;video_memory_size=0;transparent_attr=!1;char_height=10;underline_scanline=7;color_mode=s;ready=!1;renderer;constructor(A){this.machine=A,this.cursor_rate=500,this.scale_x=1,this.scale_y=1,this.width=78,this.height=30,this.cursor_state=!1,this.cursor_x=0,this.cursor_y=0,this.light_pen_x=0,this.light_pen_y=0,this.light_pen_active=0}export(){let A=(B)=>"0x"+X(B);return{scale_x:this.scale_x,scale_y:this.scale_y,width:this.width,height:this.height,cursor_state:this.cursor_state?1:0,cursor_x:this.cursor_x,cursor_y:this.cursor_y,video_memory_base:A(this.video_memory_base),video_memory_size:A(this.video_memory_size),light_pen_x:this.light_pen_x,light_pen_y:this.light_pen_y,light_pen_active:this.light_pen_active}}import(A){let B=j;this.scale_x=B(A.scale_x),this.scale_y=B(A.scale_y),this.width=B(A.width),this.height=B(A.height),this.cursor_state=B(A.cursor_state)?!0:!1,this.cursor_x=B(A.cursor_x),this.cursor_y=B(A.cursor_y),this.video_memory_base=B(A.video_memory_base),this.video_memory_size=B(A.video_memory_size),this.light_pen_x=B(A.light_pen_x),this.light_pen_y=B(A.light_pen_y),this.light_pen_active=B(A.light_pen_active)}apply_import(){this.set_geometry(this.width,this.height),this.set_video_memory(this.video_memory_base)}start(A){this.renderer=A,this.renderer.connect(this.machine),this.render_loop()}last_flip_ticks=0;tick_cursor(A,B){if(this.machine.runner.turbo){this.cursor_state=!0,this.last_flip_ticks=A;return}while(A-this.last_flip_ticks>=B)this.cursor_state=!this.cursor_state,this.last_flip_ticks+=B}render_loop(){if(this.ready)this.renderer.update();setTimeout(()=>this.render_loop(),k.#A)}last_width=-1;last_height=-1;set_geometry(A,B){if(this.width=A,this.height=B,this.video_memory_size=A*B,this.machine.ui.update_screen_geometry(this.width,this.height,this.char_height),this.last_width===this.width&&this.last_height===this.height)return;if(this.machine.log(`установлен размер экрана: ${A} x ${B}`),this.last_width=this.width,this.last_height=this.height,this.last_video_memory_base!==-1)this.ready=!0}set_char_height(A){if(this.char_height===A)return;this.char_height=A,this.machine.ui.update_screen_geometry(this.width,this.height,this.char_height)}last_video_memory_base=-1;set_video_memory(A){if(this.video_memory_base=A,this.machine.ui.update_video_memory_address(this.video_memory_base),this.last_video_memory_base===this.video_memory_base)return;if(this.machine.log("установлена видеопамять с адреса",`${X(this.video_memory_base)}`,`размером ${X(this.video_memory_size)}`),this.last_video_memory_base=this.video_memory_base,this.last_width!==-1)this.ready=!0}set_cursor(A,B){this.cursor_x=A,this.cursor_y=B}}function e(A,B,g){try{let Q=typeof A==="string"?JSON.parse(A):A;if(Q.id!="rk86")return!1;if(!B)return!1;let{screen:E,cpu:D,memory:P,keyboard:w}=B;if(D.import(Q.cpu),w.import(Q.keyboard),E.import(Q.screen),P.import(Q.memory),E.apply_import(),g&&Q.boot?.keyboard)g(Q.boot?.keyboard);return!0}catch(Q){return console.error("failed restoring snapshot",Q),!1}}var F=6,L=8,v=1;class i{machine;ctx;font;fontByColor=new Map;cache=[];cachedWidth=0;cachedHeight=0;cachedCharHeight=0;cachedUnderlineScanline=-1;cachedVideoBase=-1;cachedColorMode="";lastCursorX=0;lastCursorY=0;connect(A){this.machine=A,this.ctx=A.ui.canvas.getContext("2d"),this.font=new Image,this.font.onload=()=>this.resetCache(this.cache.length),this.font.src=A.font;let B=A.ui.canvas;B.onmousemove=this.handleMousemove.bind(this),B.onmouseup=()=>A.screen.light_pen_active=0,B.onmousedown=()=>A.screen.light_pen_active=1}tintedFont(A){if(!this.font.complete||this.font.naturalWidth===0)return null;let B=this.fontByColor.get(A);if(B)return B;let g=document.createElement("canvas");g.width=this.font.width,g.height=this.font.height;let Q=g.getContext("2d");return Q.drawImage(this.font,0,0),Q.globalCompositeOperation="multiply",Q.fillStyle=V(A),Q.fillRect(0,0,g.width,g.height),this.fontByColor.set(A,g),g}update(){let{screen:A,memory:B}=this.machine,g=A.color_mode;if(A.width!==this.cachedWidth||A.height!==this.cachedHeight||A.char_height!==this.cachedCharHeight){let z=A.width*F*A.scale_x,O=A.height*A.char_height*A.scale_y;this.machine.ui.resize_canvas(z,O),this.ctx.imageSmoothingEnabled=!1,this.ctx.fillStyle="#000000",this.ctx.fillRect(0,0,z,O),this.cachedWidth=A.width,this.cachedHeight=A.height,this.cachedCharHeight=A.char_height,this.resetCache(A.width*A.height)}if(A.video_memory_base!==this.cachedVideoBase)this.resetCache(A.width*A.height),this.cachedVideoBase=A.video_memory_base;if(g!==this.cachedColorMode)this.resetCache(A.width*A.height),this.cachedColorMode=g;if(A.underline_scanline!==this.cachedUnderlineScanline)this.resetCache(A.width*A.height),this.cachedUnderlineScanline=A.underline_scanline;let Q=0,E=!1,D=Math.floor(Date.now()/320)%2===1,P=A.video_memory_base,w=!1,I=A.transparent_attr,N=a(g)&&!I,R=-1,f=Array(A.width);for(let z=0;z<A.height;++z){let O=z*A.width;if(I){let C=[],M=!1,x=0,J=w,Y=0;while(x<A.width&&!J){let H=B.read(P+Y);if(Y++,M){C.push(H),M=!1;continue}if(H>=240){if(f[x++]={ch:0,attrs:Q,blink:E,isFA:!1},J=!0,H>=248)w=!0}else if(H>=192)f[x++]={ch:0,attrs:Q,blink:E,isFA:!1};else if(H>=128)Q=H,E=(H&2)!==0,f[x++]={ch:R,attrs:Q,blink:E,isFA:!0},M=!0;else f[x++]={ch:H,attrs:Q,blink:E,isFA:!1}}while(x<A.width)f[x++]={ch:0,attrs:Q,blink:E,isFA:!1};let S=0;for(let H=0;H<A.width;++H)if(f[H].ch===R)f[H].ch=(C[S]??0)&127,S++;P+=Y;let U=(z+1)*A.width;if(P-A.video_memory_base<U)P=A.video_memory_base+U}else{let C=w;for(let M=0;M<A.width;++M){let x=B.read(P+M),J,Y=!1;if(C)J=0;else if(x>=240){if(J=0,C=!0,x>=248)w=!0}else if(x>=192)J=0;else if(x>=128)Q=x,E=(x&2)!==0,J=0,Y=!0;else J=x;f[M]={ch:J,attrs:Q,blink:E,isFA:Y}}P+=A.width}for(let C=0;C<A.width;++C){let M=f[C],x=M.blink&&D?0:M.ch,J=M.attrs;if(N&&C+1<A.width&&f[C+1].isFA)J=f[C+1].attrs;let Y=c(g,J),S=!M.isFA&&(M.attrs&16)!==0,U=!M.isFA&&(M.attrs&32)!==0,H=x+Y*256+(S?4294967296:0)+(U?8589934592:0);if(this.cache[O+C]!==H)this.drawChar(C,z,x,Y,S,U),this.cache[O+C]=H}}this.drawCursor(A.cursor_x,A.cursor_y,A.cursor_state)}resetCache(A){this.cache=[];for(let B=0;B<A;++B)this.cache[B]=-1}drawChar(A,B,g,Q,E,D){let{scale_x:P,scale_y:w,char_height:I}=this.machine.screen,N=A*F*P,R=I*w,f=B*R,z=F*P,O=L*w;this.ctx.fillStyle=E?V(Q):"#000000",this.ctx.fillRect(N,f,z,R);let C=this.tintedFont(Q);if(C)if(E)this.ctx.globalCompositeOperation="difference",this.ctx.drawImage(C,2,L*g,F,L,N,f,z,O),this.ctx.globalCompositeOperation="source-over";else this.ctx.drawImage(C,2,L*g,F,L,N,f,z,O);if(D){let{underline_scanline:M}=this.machine.screen;if(M<I)this.ctx.fillStyle=E?"#000000":V(Q),this.ctx.fillRect(N,f+M*w,z,w)}}drawCursor(A,B,g){let{scale_x:Q,scale_y:E,char_height:D}=this.machine.screen,P=Math.min(L,D-v),w=(N)=>(N*D+P)*E;if(this.lastCursorX!==A||this.lastCursorY!==B)this.ctx.fillStyle="#000000",this.ctx.fillRect(this.lastCursorX*F*Q,w(this.lastCursorY),F*Q,v*E),this.lastCursorX=A,this.lastCursorY=B;let I=A*F*Q;this.ctx.fillStyle=g?"#ffffff":"#000000",this.ctx.fillRect(I,w(B),F*Q,v*E)}handleMousemove(A){let B=this.machine.ui.canvas,g=B.getBoundingClientRect(),Q=B.width/g.width,E=B.height/g.height,D=(A.clientX-g.left)*Q,P=(A.clientY-g.top)*E,{scale_x:w,scale_y:I,char_height:N}=this.machine.screen;this.machine.screen.light_pen_x=Math.floor(D/(F*w)),this.machine.screen.light_pen_y=Math.floor(P/(N*I))}}class T{machine;previous_bit_ticks=0;bit_started=!1;bit_count=0;current_byte=0;written_bytes=[];written_bytes_from_e6=0;output_block_count=0;output_timer=null;constructor(A){this.machine=A}save(A){let B=new Uint8Array(A),g=new Blob([B],{type:"image/gif"}),Q=`rk86-tape-${this.output_block_count}.bin`;T.saveAs(g,Q),this.output_block_count+=1}log(A){for(let B=0;B<A.length;B+=16){let g=A.slice(B,B+16);console.log(B.toString(16).padStart(4,"0").toUpperCase()+":",g.map((Q)=>Q.toString(16).padStart(2,"0")).join(" "))}}write_ended=()=>{this.bit_started=!1,this.current_byte=0,this.bit_count=0,this.written_bytes=[],this.written_bytes_from_e6=0;let A=this.machine.ui;A.update_activity_indicator(!1),A.hightlight_written_bytes(!1)};flush=()=>{let A=this.written_bytes.findIndex((B)=>B===230);if(A===-1)console.error("sync byte E6 is not found"),this.log(this.written_bytes);else{console.log(`${A} bytes before sync byte`);let B=this.written_bytes.slice(A);this.log(B),this.save(B)}this.write_ended()};write_bit=(A)=>{let B=this.machine.runner.total_ticks;if(B-this.previous_bit_ticks>1e4)console.log("reset tape buffer due to timeout"),this.write_ended();if(!this.bit_started)this.bit_started=!0;else if(this.bit_started=!1,this.current_byte|=(A?128:0)>>this.bit_count,this.bit_count<7)this.bit_count+=1;else{if(this.written_bytes.push(this.current_byte),this.current_byte===230||this.written_bytes_from_e6>0)this.written_bytes_from_e6+=1;if(this.written_bytes.length===1)this.machine.ui.update_activity_indicator(!0),this.machine.ui.update_written_bytes(0);if(this.written_bytes_from_e6===1)this.machine.ui.hightlight_written_bytes(!0);if(this.written_bytes_from_e6>0)this.machine.ui.update_written_bytes(this.written_bytes_from_e6);if(this.output_timer)clearTimeout(this.output_timer);this.output_timer=setTimeout(this.flush,1000),this.current_byte=0,this.bit_count=0}this.previous_bit_ticks=B};static saveAs(A,B){let g=URL.createObjectURL(A),Q=document.createElement("a");Q.href=g,Q.download=B,Q.style.display="none",document.body.appendChild(Q),Q.click(),setTimeout(()=>{document.body.removeChild(Q),URL.revokeObjectURL(g)},100)}}var AA={"mon32.bin":"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","mon32-color.bin":"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"};class BA{canvas;visualizer_visible=!1;constructor(A){this.canvas=A}resize_canvas(A,B){this.canvas.width=A,this.canvas.height=B}update_screen_geometry(A,B,g){}update_video_memory_address(A){}update_ruslat=(A)=>{};update_activity_indicator=(A)=>{};update_written_bytes=(A)=>{};hightlight_written_bytes=(A)=>{};on_visualizer_hit;on_pause_changed;start_update_perf=()=>{};screenshot(){}memory_snapshot(){}emulator_snapshot(){}}class gA{input=(A)=>0;output=(A,B)=>{};interrupt=(A)=>{}}async function QA(A,B){let g=B.startsWith("http")?B:`${A}${B}`;try{let Q=await fetch(g);if(!Q.ok)throw Error(`HTTP ${Q.status}`);return Array.from(new Uint8Array(await Q.arrayBuffer()))}catch(Q){console.error(`radio86-emulator: failed to fetch ${g}:`,Q)}}function xA(A){let B=atob(A),g=Array(B.length);for(let Q=0;Q<B.length;Q++)g[Q]=B.charCodeAt(Q);return g}async function IA(A,B){let g=AA[B];if(g)return xA(g);return QA(A,B)}function EA(A,B,g){if(g>=B.length)return;let{keys:Q,duration:E,action:D}=B[g],P=D==="down"?A.onkeydown:A.onkeyup;if(D!=="pause")if(Array.isArray(Q))Q.forEach((w)=>P(typeof w==="string"?w:String(w)));else P(typeof Q==="string"?Q:String(Q));setTimeout(()=>EA(A,B,g+1),+E)}class DA extends HTMLElement{machine;keyboard;canvas;_keydownHandler;_keyupHandler;_focusable=!1;static get observedAttributes(){return["monitor","file","scale","files-path","focusable"]}connectedCallback(){if(this._focusable=this.hasAttribute("focusable"),this.canvas=document.createElement("canvas"),this.canvas.style.display="block",this.appendChild(this.canvas),this._focusable&&this.tabIndex<0)this.tabIndex=0;this.boot()}disconnectedCallback(){let A=this._focusable?this:document;if(this._keydownHandler)A.removeEventListener("keydown",this._keydownHandler);if(this._keyupHandler)A.removeEventListener("keyup",this._keyupHandler)}async boot(){if(!this.canvas)return;let A=this.getAttribute("monitor")||"mon32.bin",B=this.getAttribute("file"),g=this.getAttribute("scale"),Q=this.getAttribute("files-path")||"files/",E=new Z;this.keyboard=E;let D=new gA,w={font:r(),keyboard:E,io:D,log:(...C)=>console.log(...C)};this.machine=w,w.ui=new BA(this.canvas),w.memory=new $(w),D.input=(C)=>w.memory.read(C|C<<8),D.output=(C,M)=>w.memory.write(C|C<<8,M),w.cpu=new K(w),w.screen=new k(w),w.tape=new T(w),w.runner=new m(w),w.memory.update_ruslat=w.ui.update_ruslat;let I=await IA(Q,A);if(!I){console.error("radio86-emulator: failed to load monitor ROM");return}let N=W(A,I);if(w.memory.load_file(N),w.screen.start(new i),g!=="auto")this.canvas.style.imageRendering="pixelated";let R=(C)=>{let M=o(C);EA(E,M,0)},f;if(B){let C=await QA(Q,B);if(C){let{ok:M,json:x}=n(C);if(M)e(x,w,R);else{let J=W(B,C);w.memory.load_file(J),f=J.entry}}}if(w.runner.execute(),f!==void 0)setTimeout(()=>w.cpu.jump(f),500);let z=this._focusable;this._keydownHandler=(C)=>{if(E.onkeydown(C.code),z&&C.code!=="Tab")C.preventDefault()},this._keyupHandler=(C)=>{if(E.onkeyup(C.code),z&&C.code!=="Tab")C.preventDefault()};let O=z?this:document;O.addEventListener("keydown",this._keydownHandler),O.addEventListener("keyup",this._keyupHandler),w.reset=()=>{E.reset(),w.cpu.jump(63488)},w.restart=()=>{w.memory.zero_ram(),w.reset()},w.pause=(C)=>{w.runner.paused=C},this.dispatchEvent(new CustomEvent("ready",{detail:{machine:w}}))}}if(!customElements.get("radio86-emulator"))customElements.define("radio86-emulator",DA);export{DA as Radio86Emulator};