rk86 2.0.11 → 2.0.13
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/package.json +1 -1
- package/rk86.js +133 -97
package/package.json
CHANGED
package/rk86.js
CHANGED
|
@@ -1588,11 +1588,37 @@ var init_catalog_data = __esm(() => {
|
|
|
1588
1588
|
];
|
|
1589
1589
|
});
|
|
1590
1590
|
|
|
1591
|
-
// src/lib/rk86_terminal.ts
|
|
1591
|
+
// src/lib/terminal/rk86_terminal.ts
|
|
1592
1592
|
import { existsSync } from "fs";
|
|
1593
|
+
// packages/rk86/package.json
|
|
1594
|
+
var package_default = {
|
|
1595
|
+
name: "rk86",
|
|
1596
|
+
version: "2.0.12",
|
|
1597
|
+
description: "\u042D\u043C\u0443\u043B\u044F\u0442\u043E\u0440 \u0420\u0430\u0434\u0438\u043E-86\u0420\u041A (Intel 8080) \u0434\u043B\u044F \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430",
|
|
1598
|
+
bin: {
|
|
1599
|
+
rk86: "rk86.js"
|
|
1600
|
+
},
|
|
1601
|
+
type: "module",
|
|
1602
|
+
keywords: [
|
|
1603
|
+
"rk86",
|
|
1604
|
+
"radio-86rk",
|
|
1605
|
+
"emulator",
|
|
1606
|
+
"intel-8080",
|
|
1607
|
+
"i8080",
|
|
1608
|
+
"retro"
|
|
1609
|
+
],
|
|
1610
|
+
author: "Alexander Demin",
|
|
1611
|
+
license: "MIT",
|
|
1612
|
+
repository: {
|
|
1613
|
+
type: "git",
|
|
1614
|
+
url: "https://github.com/begoon/rk86-js-web"
|
|
1615
|
+
}
|
|
1616
|
+
};
|
|
1617
|
+
|
|
1618
|
+
// src/lib/terminal/rk86_terminal.ts
|
|
1593
1619
|
import { readFile } from "fs/promises";
|
|
1594
1620
|
|
|
1595
|
-
// src/lib/hex.ts
|
|
1621
|
+
// src/lib/core/hex.ts
|
|
1596
1622
|
function hex(v, prefix) {
|
|
1597
1623
|
return v.toString(16).toUpperCase();
|
|
1598
1624
|
}
|
|
@@ -1612,7 +1638,7 @@ function fromHex(v) {
|
|
|
1612
1638
|
return v;
|
|
1613
1639
|
}
|
|
1614
1640
|
|
|
1615
|
-
// src/lib/i8080.ts
|
|
1641
|
+
// src/lib/core/i8080.ts
|
|
1616
1642
|
class I8080 {
|
|
1617
1643
|
memory;
|
|
1618
1644
|
io;
|
|
@@ -2462,7 +2488,7 @@ class I8080 {
|
|
|
2462
2488
|
}
|
|
2463
2489
|
}
|
|
2464
2490
|
|
|
2465
|
-
// src/lib/rk86_file_parser.ts
|
|
2491
|
+
// src/lib/core/rk86_file_parser.ts
|
|
2466
2492
|
var extract_rk86_word = function(v, i) {
|
|
2467
2493
|
return (v[i] & 255) << 8 | v[i + 1] & 255;
|
|
2468
2494
|
};
|
|
@@ -2542,12 +2568,12 @@ function extact_metadata(text) {
|
|
|
2542
2568
|
return [...text.matchAll(/!([^ =\t\n\r]+?)=([^ \t\r\n]+)/g)].map((group) => group.slice(1)).reduce((a, [key, value]) => (a[key] = value, a), initial);
|
|
2543
2569
|
}
|
|
2544
2570
|
|
|
2545
|
-
// src/lib/rk86_font.ts
|
|
2571
|
+
// src/lib/core/rk86_font.ts
|
|
2546
2572
|
function rk86_font_image() {
|
|
2547
2573
|
return "data:image/bmp;base64," + "Qk0+IAAAAAAAAD4AAAAoAAAACAAAAAAIAAABAAEAAAAAAAAgAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAP///wAAAAAAGAAAABgAAAB+AAAAfgAAABgAAAAYAAAA" + "AAAAAAAAAAABAAAAAQAAAA8AAAAJAAAACQAAAAAAAAAAAAAAAQAAAD8AAAAq" + "AAAAKgAAACoAAAAqAAAAAAAAAAAAAAAAAAAADgAAAAEAAAAHAAAAAQAAAA4A" + "AAAAAAAAAAAAAAAAAAAfAAAAFQAAABUAAAAVAAAAFQAAAAAAAAAAAAAAAAAA" + "AA4AAAABAAAAAgAAAAkAAAAGAAAAAAAAAAAAAAAAAAAAGQAAABUAAAAZAAAA" + "EQAAABEAAAAAAAAAAAAAAAAAAAAOAAAACQAAAA4AAAAIAAAACAAAAAAAAAAA" + "AAAAAAAAAA4AAAAJAAAADgAAAAkAAAAOAAAAAAAAAAAAAAAAAAAAFQAAABUA" + "AAAOAAAAFQAAABUAAAAAAAAAAAAAAAAAAAAOAAAAAQAAAAcAAAAJAAAACQAA" + "AAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAfAAAAAAAAAAAAAAAAAAAA" + "BwAAAAgAAAAIAAAACAAAAAcAAAAAAAAAAAAAAAgAAAAIAAAACAAAAA4AAAAJ" + "AAAADgAAAAAAAAAAAAAAAAAAAAkAAAAFAAAABwAAAAkAAAAHAAAAAAAAAAAA" + "AAAAAAAACQAAAAkAAAAJAAAACQAAAA8AAAAAAAAAAAAAAAAAAAAGAAAACQAA" + "AAkAAAAJAAAABgAAAAAAAAAAAAAAAAAAAAkAAAAJAAAADwAAAAkAAAAJAAAA" + "AAAAAAAAAAAAAAAAEQAAABUAAAAVAAAAGwAAABEAAAAAAAAAAAAAAAAAAAAJ" + "AAAACQAAAAkAAAAFAAAAAwAAAAAAAAAAAAAAAAAAAAkAAAAKAAAADAAAAAoA" + "AAAJAAAAAAAAAAAAAAAAAAAACQAAAA0AAAALAAAACQAAAAkAAAAAAAAABgAA" + "AAAAAAAJAAAADQAAAAsAAAAJAAAACQAAAAAAAAAAAAAAAAAAAAkAAAAJAAAA" + "BgAAAAYAAAAJAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAIAAAACAAAAA8AAAAA" + "AAAAAAAAAAQAAAAEAAAADgAAABUAAAAOAAAABAAAAAAAAAAAAAAAAAAAAAcA" + "AAAIAAAADgAAAAkAAAAGAAAAAAAAAAAAAAAAAAAADwAAAAEAAAAHAAAACQAA" + "AAYAAAAAAAAAAAAAAAEAAAAfAAAAEgAAABIAAAASAAAAEgAAAAAAAAAAAAAA" + "AAAAAA4AAAAJAAAADgAAAAgAAAAHAAAAAAAAAAAAAAAAAAAABgAAAAkAAAAH" + "AAAAAQAAAA4AAAAAAAAAAAAAAAAAAAASAAAAFQAAAB0AAAAVAAAAEgAAAAAA" + "AAAAAAAAAAAAAAQAAAAMAAAAHgAAAD8AAAAeAAAADAAAAAgAAAAAAAAAAQAA" + "AAMAAAAPAAAADAAAAAgAAAAAAAAAAAAAAAAAAAARAAAACAAAAAgAAAAEAAAA" + "CAAAAAgAAAAQAAAAAAAAAAgAAAAIAAAACAAAAAAAAAAIAAAACAAAAAgAAAAA" + "AAAAAQAAAAIAAAACAAAABAAAAAIAAAACAAAAAQAAAAAAAAAPAAAACAAAAAYA" + "AAABAAAADwAAAAAAAAAAAAAAAAAAAA4AAAABAAAABwAAAAkAAAAJAAAAAAAA" + "AAAAAAAAAAAAEQAAAAoAAAACAAAACgAAABEAAAAAAAAAAAAAAAAAAAAKAAAA" + "FQAAABUAAAARAAAAEQAAAAAAAAAAAAAAAAAAAAQAAAAKAAAAEQAAABEAAAAR" + "AAAAAAAAAAAAAAAAAAAADgAAABEAAAARAAAAEQAAABEAAAAAAAAAAAAAAAAA" + "AAAGAAAACQAAAAgAAAAIAAAAHAAAAAgAAAAIAAAAAAAAAA4AAAABAAAABgAA" + "AAgAAAAHAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAIAAAACQAAAA4AAAAAAAAA" + "AAAAAAAAAAABAAAABwAAAAkAAAAJAAAABwAAAAAAAAAAAAAAAAAAAAgAAAAO" + "AAAACQAAAAkAAAAOAAAAAAAAAAAAAAAAAAAABgAAAAkAAAAJAAAACQAAAAYA" + "AAAAAAAAAAAAAAAAAAAJAAAACQAAAAkAAAAJAAAADgAAAAAAAAAAAAAAAAAA" + "ABUAAAAVAAAAFQAAABUAAAAaAAAAAAAAAAAAAAAAAAAABwAAAAIAAAACAAAA" + "AgAAAAIAAAACAAAABgAAAAAAAAAJAAAACgAAAAwAAAAKAAAACQAAAAgAAAAI" + "AAAAAAAAAAYAAAAJAAAAAQAAAAEAAAABAAAAAAAAAAEAAAAAAAAABwAAAAIA" + "AAACAAAAAgAAAAYAAAAAAAAAAgAAAAAAAAAJAAAACQAAAAkAAAAJAAAADgAA" + "AAgAAAAIAAAAAAAAAA4AAAABAAAABwAAAAkAAAAHAAAAAAAAAAAAAAAAAAAA" + "CAAAAAgAAAAIAAAAHAAAAAgAAAAJAAAABgAAAAAAAAAHAAAACAAAAA4AAAAJ" + "AAAABgAAAAAAAAAAAAAAAAAAAAcAAAAJAAAACQAAAAkAAAAHAAAAAQAAAAEA" + "AAAAAAAABwAAAAgAAAAIAAAACAAAAAcAAAAAAAAAAAAAAAAAAAAOAAAACQAA" + "AAkAAAAJAAAADgAAAAgAAAAIAAAAAAAAAA0AAAASAAAAEgAAABIAAAAOAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAEAAAAAAAAAAE" + "AAAAAAAAAAQAAAACAAAAAQAAABEAAAAOAAAAAAAAAAgAAAAEAAAAAgAAAAEA" + "AAACAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAAAAA" + "AAAAAAACAAAABAAAAAgAAAAQAAAACAAAAAQAAAACAAAAAAAAAAgAAAAEAAAA" + "DAAAAAwAAAAAAAAADAAAAAwAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAM" + "AAAAAAAAAAAAAAAcAAAAAgAAAAEAAAAPAAAAEQAAABEAAAAOAAAAAAAAAA4A" + "AAARAAAAEQAAAA4AAAARAAAAEQAAAA4AAAAAAAAACAAAAAgAAAAIAAAABAAA" + "AAIAAAABAAAAHwAAAAAAAAAOAAAAEQAAABEAAAAeAAAAEAAAAAgAAAAHAAAA" + "AAAAAA4AAAARAAAAAQAAAAEAAAAeAAAAEAAAAB8AAAAAAAAAAgAAAAIAAAAf" + "AAAAEgAAAAoAAAAGAAAAAgAAAAAAAAAOAAAAEQAAAAEAAAAGAAAAAgAAAAEA" + "AAAfAAAAAAAAAB8AAAAQAAAACAAAAAYAAAABAAAAEQAAAA4AAAAAAAAADgAA" + "AAQAAAAEAAAABAAAAAQAAAAMAAAABAAAAAAAAAAOAAAAEQAAABkAAAAVAAAA" + "EwAAABEAAAAOAAAAAAAAAAAAAAAQAAAACAAAAAQAAAACAAAAAQAAAAAAAAAA" + "AAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAfAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAADAAAAAwAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAQAAAAEAAAAHwAAAAQAAAAEAAAAAAAAAAAAAAAAAAAA" + "BAAAABUAAAAOAAAAFQAAAAQAAAAAAAAAAAAAAAgAAAAEAAAAAgAAAAIAAAAC" + "AAAABAAAAAgAAAAAAAAAAgAAAAQAAAAIAAAACAAAAAgAAAAEAAAAAgAAAAAA" + "AAAAAAAAAAAAAAAAAAAEAAAAAgAAAAYAAAAGAAAAAAAAAA0AAAASAAAAFQAA" + "AAwAAAAKAAAACgAAAAQAAAAAAAAAAwAAABMAAAAIAAAABAAAAAIAAAAZAAAA" + "GAAAAAAAAAAEAAAAHgAAAAUAAAAOAAAAFAAAAA8AAAAEAAAAAAAAAAoAAAAK" + "AAAAHwAAAAoAAAAfAAAACgAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoA" + "AAAKAAAACgAAAAAAAAAEAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAABQAAAD0AAAAnAAAAIAAAACAAAAA4" + "AAAABAAAAAwAAAAdAAAAPwAAAD8AAAAdAAAADAAAAAQAAAAAAAAAAAAAAAAA" + "AAA/AAAAPwAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAA" + "AAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8A" + "AAA/AAAAPwAAAD8AAAA/AAAABwAAAAcAAAAHAAAABwAAAD8AAAA/AAAAPwAA" + "AD8AAAA4AAAAOAAAADgAAAA4AAAAPwAAAD8AAAA/AAAAPwAAAAAAAAAAAAAA" + "AAAAAAAAAAA4AAAAOAAAADgAAAA4AAAAPwAAAD8AAAA/AAAAPwAAADgAAAA4" + "AAAAOAAAADgAAAAHAAAABwAAAAcAAAAHAAAAOAAAADgAAAA4AAAAOAAAADgA" + "AAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAAAAAAAAAAAAAAAAAAAAA" + "AAwAAAAeAAAAPwAAAAwAAAAMAAAADAAAAAwAAAAMAAAACAAAAAwAAAAuAAAA" + "PwAAAD8AAAAuAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwA" + "AAAMAAAADAAAAAwAAAA/AAAAHgAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAACEAAAASAAAADAAAAAwAAAAtAAAAPwAAAAwAAAAMAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAABwAAAAcAAAAH" + "AAAAPwAAAD8AAAA/AAAAPwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcA" + "AAAHAAAABwAAAAcAAAAHAAAABwAAADgAAAA4AAAAOAAAADgAAAAHAAAABwAA" + "AAcAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAA" + "PwAAAD8AAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAHAAAABwAAAAcAAAAA" + "AAAAAAAAAAAAAAAAAAAAOAAAADgAAAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAA" + "AD8AAAAAAAAAAQAAAAEAAAABAAAAHwAAABEAAAARAAAAEQAAAAAAAAABAAAA" + "HwAAABUAAAAVAAAAFQAAABUAAAAVAAAAAAAAAA4AAAARAAAAAQAAAAcAAAAB" + "AAAAEQAAAA4AAAAAAAAAHwAAABUAAAAVAAAAFQAAABUAAAAVAAAAEQAAAAAA" + "AAAOAAAAEQAAAAEAAAAGAAAAEQAAABEAAAAOAAAAAAAAABkAAAAVAAAAFQAA" + "ABkAAAARAAAAEQAAABEAAAAAAAAAHgAAABEAAAARAAAAHgAAABAAAAAQAAAA" + "EAAAAAAAAAAeAAAAEQAAABEAAAAeAAAAEQAAABEAAAAeAAAAAAAAABEAAAAV" + "AAAAFQAAAA4AAAAVAAAAFQAAABEAAAAAAAAAEAAAAAgAAAAEAAAACgAAABEA" + "AAARAAAAEQAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAfAAAAAAAA" + "AA4AAAARAAAAEAAAABAAAAAQAAAAEQAAAA4AAAAAAAAAEAAAABAAAAAQAAAA" + "HgAAABEAAAARAAAAHgAAAAAAAAARAAAACQAAAAUAAAAPAAAAEQAAABEAAAAP" + "AAAAAAAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAAB8AAAAAAAAADgAAABEA" + "AAARAAAAEQAAABEAAAARAAAADgAAAAAAAAARAAAAEQAAABEAAAAfAAAAEQAA" + "ABEAAAARAAAAAAAAABEAAAARAAAAEQAAABUAAAAVAAAAGwAAABEAAAAAAAAA" + "CQAAAAkAAAAJAAAACQAAAAkAAAAJAAAABwAAAAAAAAARAAAAEgAAABQAAAAY" + "AAAAFAAAABIAAAARAAAAAAAAABEAAAARAAAAGQAAABUAAAATAAAAEQAAABUA" + "AAAAAAAAEQAAABEAAAAZAAAAFQAAABMAAAARAAAAEQAAAAAAAAARAAAAEQAA" + "AAoAAAAEAAAACgAAABEAAAARAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAA" + "EQAAAB8AAAAAAAAABAAAAAQAAAAfAAAAFQAAABUAAAAfAAAABAAAAAAAAAAf" + "AAAAEAAAABAAAAAeAAAAEAAAABAAAAAfAAAAAAAAABEAAAAfAAAACgAAAAoA" + "AAAKAAAACgAAAAYAAAAAAAAAAQAAAB8AAAASAAAAEgAAABIAAAASAAAAEgAA" + "AAAAAAAeAAAAEQAAABEAAAAeAAAAEAAAABAAAAAfAAAAAAAAABEAAAARAAAA" + "HwAAABEAAAARAAAACgAAAAQAAAAAAAAAEgAAABUAAAAVAAAAHQAAABUAAAAV" + "AAAAEgAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAEQAAAA4AAAAAAAAADgAAAAIAAAACAAAAAgAA" + "AAIAAAACAAAADgAAAAAAAAAAAAAAAQAAAAIAAAAEAAAACAAAABAAAAAAAAAA" + "AAAAAA4AAAAIAAAACAAAAAgAAAAIAAAACAAAAA4AAAAAAAAAHwAAABAAAAAI" + "AAAADgAAAAIAAAABAAAAHwAAAAAAAAAEAAAABAAAAAQAAAAEAAAACgAAABEA" + "AAARAAAAAAAAABEAAAARAAAACgAAAAQAAAAKAAAAEQAAABEAAAAAAAAACgAA" + "ABUAAAAVAAAAFQAAABEAAAARAAAAEQAAAAAAAAAEAAAABAAAAAoAAAAKAAAA" + "EQAAABEAAAARAAAAAAAAAA4AAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAAA" + "AAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAHwAAAAAAAAAOAAAAEQAAAAEA" + "AAAOAAAAEAAAABEAAAAOAAAAAAAAABEAAAASAAAAFAAAAB4AAAARAAAAEQAA" + "AB4AAAAAAAAADQAAABIAAAAVAAAAEQAAABEAAAARAAAADgAAAAAAAAAQAAAA" + "EAAAABAAAAAeAAAAEQAAABEAAAAeAAAAAAAAAA4AAAARAAAAEQAAABEAAAAR" + "AAAAEQAAAA4AAAAAAAAAEQAAABEAAAATAAAAFQAAABkAAAARAAAAEQAAAAAA" + "AAARAAAAEQAAABEAAAAVAAAAFQAAABsAAAARAAAAAAAAAB8AAAARAAAAEAAA" + "ABAAAAAQAAAAEAAAABAAAAAAAAAAEQAAABIAAAAUAAAAGAAAABQAAAASAAAA" + "EQAAAAAAAAAOAAAAEQAAABEAAAABAAAAAQAAAAEAAAABAAAAAAAAAA4AAAAE" + "AAAABAAAAAQAAAAEAAAABAAAAA4AAAAAAAAAEQAAABEAAAARAAAAHwAAABEA" + "AAARAAAAEQAAAAAAAAAPAAAAEQAAABMAAAAQAAAAEAAAABEAAAAOAAAAAAAA" + "ABAAAAAQAAAAEAAAAB4AAAAQAAAAEAAAAB8AAAAAAAAAHwAAABAAAAAQAAAA" + "HgAAABAAAAAQAAAAHwAAAAAAAAAeAAAACQAAAAkAAAAJAAAACQAAAAkAAAAe" + "AAAAAAAAAA4AAAARAAAAEAAAABAAAAAQAAAAEQAAAA4AAAAAAAAAHgAAABEA" + "AAARAAAAHgAAABEAAAARAAAAHgAAAAAAAAARAAAAEQAAAB8AAAARAAAAEQAA" + "AAoAAAAEAAAAAAAAAA4AAAAQAAAAFwAAABUAAAATAAAAEQAAAA4AAAAAAAAA" + "BAAAAAAAAAAEAAAAAgAAAAEAAAARAAAADgAAAAAAAAAIAAAABAAAAAIAAAAB" + "AAAAAgAAAAQAAAAIAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAfAAAAAAAAAAAA" + "AAAAAAAAAgAAAAQAAAAIAAAAEAAAAAgAAAAEAAAAAgAAAAAAAAAIAAAABAAA" + "AAwAAAAMAAAAAAAAAAwAAAAMAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAMAAAA" + "DAAAAAAAAAAAAAAAHAAAAAIAAAABAAAADwAAABEAAAARAAAADgAAAAAAAAAO" + "AAAAEQAAABEAAAAOAAAAEQAAABEAAAAOAAAAAAAAAAgAAAAIAAAACAAAAAQA" + "AAACAAAAAQAAAB8AAAAAAAAADgAAABEAAAARAAAAHgAAABAAAAAIAAAABwAA" + "AAAAAAAOAAAAEQAAAAEAAAABAAAAHgAAABAAAAAfAAAAAAAAAAIAAAACAAAA" + "HwAAABIAAAAKAAAABgAAAAIAAAAAAAAADgAAABEAAAABAAAABgAAAAIAAAAB" + "AAAAHwAAAAAAAAAfAAAAEAAAAAgAAAAGAAAAAQAAABEAAAAOAAAAAAAAAA4A" + "AAAEAAAABAAAAAQAAAAEAAAADAAAAAQAAAAAAAAADgAAABEAAAAZAAAAFQAA" + "ABMAAAARAAAADgAAAAAAAAAAAAAAEAAAAAgAAAAEAAAAAgAAAAEAAAAAAAAA" + "AAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAwAAAAMAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAEAAAABAAAAB8AAAAEAAAABAAAAAAAAAAAAAAAAAAA" + "AAQAAAAVAAAADgAAABUAAAAEAAAAAAAAAAAAAAAIAAAABAAAAAIAAAACAAAA" + "AgAAAAQAAAAIAAAAAAAAAAIAAAAEAAAACAAAAAgAAAAIAAAABAAAAAIAAAAA" + "AAAAAAAAAAAAAAAAAAAABAAAAAIAAAAGAAAABgAAAAAAAAANAAAAEgAAABUA" + "AAAMAAAACgAAAAoAAAAEAAAAAAAAAAMAAAATAAAACAAAAAQAAAACAAAAGQAA" + "ABgAAAAAAAAABAAAAB4AAAAFAAAADgAAABQAAAAPAAAABAAAAAAAAAAKAAAA" + "CgAAAB8AAAAKAAAAHwAAAAoAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK" + "AAAACgAAAAoAAAAAAAAABAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAUAAAA9AAAAJwAAACAAAAAgAAAA" + "OAAAAAQAAAAMAAAAHQAAAD8AAAA/AAAAHQAAAAwAAAAEAAAAAAAAAAAAAAAA" + "AAAAPwAAAD8AAAAAAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwA" + "AAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/" + "AAAAPwAAAD8AAAA/AAAAPwAAAAcAAAAHAAAABwAAAAcAAAA/AAAAPwAAAD8A" + "AAA/AAAAOAAAADgAAAA4AAAAOAAAAD8AAAA/AAAAPwAAAD8AAAAAAAAAAAAA" + "AAAAAAAAAAAAOAAAADgAAAA4AAAAOAAAAD8AAAA/AAAAPwAAAD8AAAA4AAAA" + "OAAAADgAAAA4AAAABwAAAAcAAAAHAAAABwAAADgAAAA4AAAAOAAAADgAAAA4" + "AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAA" + "AAAMAAAAHgAAAD8AAAAMAAAADAAAAAwAAAAMAAAADAAAAAgAAAAMAAAALgAA" + "AD8AAAA/AAAALgAAAAwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAM" + "AAAADAAAAAwAAAAMAAAAPwAAAB4AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAhAAAAEgAAAAwAAAAMAAAALQAAAD8AAAAMAAAADAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAcAAAAHAAAA" + "BwAAAD8AAAA/AAAAPwAAAD8AAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAH" + "AAAABwAAAAcAAAAHAAAABwAAAAcAAAA4AAAAOAAAADgAAAA4AAAABwAAAAcA" + "AAAHAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAA" + "AD8AAAA/AAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAHAAAABwAAAAcAAAAHAAAA" + "AAAAAAAAAAAAAAAAAAAAADgAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAA==";
|
|
2548
2574
|
}
|
|
2549
2575
|
|
|
2550
|
-
// src/lib/rk86_keyboard.ts
|
|
2576
|
+
// src/lib/core/rk86_keyboard.ts
|
|
2551
2577
|
class Keyboard {
|
|
2552
2578
|
state;
|
|
2553
2579
|
modifiers;
|
|
@@ -2663,7 +2689,7 @@ var SS = 32;
|
|
|
2663
2689
|
var US = 64;
|
|
2664
2690
|
var RL = 128;
|
|
2665
2691
|
|
|
2666
|
-
// src/lib/hex_map.ts
|
|
2692
|
+
// src/lib/core/hex_map.ts
|
|
2667
2693
|
function create(array, width = 16) {
|
|
2668
2694
|
const v = {};
|
|
2669
2695
|
for (let i = 0;i < array.length; i += width) {
|
|
@@ -2683,7 +2709,7 @@ function parse2(hex2) {
|
|
|
2683
2709
|
return array;
|
|
2684
2710
|
}
|
|
2685
2711
|
|
|
2686
|
-
// src/lib/rk86_memory.ts
|
|
2712
|
+
// src/lib/core/rk86_memory.ts
|
|
2687
2713
|
class Memory {
|
|
2688
2714
|
buf = [];
|
|
2689
2715
|
update_ruslat = () => {};
|
|
@@ -2958,63 +2984,7 @@ class Memory {
|
|
|
2958
2984
|
}
|
|
2959
2985
|
}
|
|
2960
2986
|
|
|
2961
|
-
// src/lib/
|
|
2962
|
-
class SoundPlayer {
|
|
2963
|
-
audioCtx;
|
|
2964
|
-
gainNode;
|
|
2965
|
-
oscillator = null;
|
|
2966
|
-
constructor(audioContext) {
|
|
2967
|
-
this.audioCtx = audioContext;
|
|
2968
|
-
this.gainNode = this.audioCtx.createGain();
|
|
2969
|
-
this.gainNode.connect(this.audioCtx.destination);
|
|
2970
|
-
}
|
|
2971
|
-
play(freq, volume, wave) {
|
|
2972
|
-
this.oscillator = this.audioCtx.createOscillator();
|
|
2973
|
-
this.oscillator.connect(this.gainNode);
|
|
2974
|
-
this.oscillator.frequency.setValueAtTime(freq, this.audioCtx.currentTime);
|
|
2975
|
-
if (wave) {
|
|
2976
|
-
this.oscillator.type = wave;
|
|
2977
|
-
}
|
|
2978
|
-
this.gainNode.gain.value = volume;
|
|
2979
|
-
this.oscillator.start();
|
|
2980
|
-
}
|
|
2981
|
-
stop(when) {
|
|
2982
|
-
const offset = when || 0.05;
|
|
2983
|
-
if (this.oscillator)
|
|
2984
|
-
this.oscillator.stop(this.audioCtx.currentTime + offset);
|
|
2985
|
-
}
|
|
2986
|
-
}
|
|
2987
|
-
|
|
2988
|
-
// src/lib/rk86_sound.ts
|
|
2989
|
-
class Sound {
|
|
2990
|
-
volume = 0.05;
|
|
2991
|
-
stop_timer = null;
|
|
2992
|
-
previous_tone = null;
|
|
2993
|
-
player;
|
|
2994
|
-
constructor() {
|
|
2995
|
-
const ctx = new AudioContext;
|
|
2996
|
-
ctx.resume();
|
|
2997
|
-
this.player = new SoundPlayer(ctx);
|
|
2998
|
-
}
|
|
2999
|
-
set_stop_timer(duration) {
|
|
3000
|
-
return setTimeout(() => {
|
|
3001
|
-
this.player.stop();
|
|
3002
|
-
this.previous_tone = null;
|
|
3003
|
-
}, duration * 1000);
|
|
3004
|
-
}
|
|
3005
|
-
play(tone, duration) {
|
|
3006
|
-
clearTimeout(this.stop_timer);
|
|
3007
|
-
if (this.previous_tone !== tone) {
|
|
3008
|
-
if (this.previous_tone)
|
|
3009
|
-
this.player.stop();
|
|
3010
|
-
this.player.play(tone, this.volume, "square");
|
|
3011
|
-
}
|
|
3012
|
-
this.previous_tone = tone;
|
|
3013
|
-
this.stop_timer = this.set_stop_timer(duration);
|
|
3014
|
-
}
|
|
3015
|
-
}
|
|
3016
|
-
|
|
3017
|
-
// src/lib/rk86_runner.ts
|
|
2987
|
+
// src/lib/core/rk86_runner.ts
|
|
3018
2988
|
class Runner {
|
|
3019
2989
|
paused = false;
|
|
3020
2990
|
tracer = null;
|
|
@@ -3024,6 +2994,7 @@ class Runner {
|
|
|
3024
2994
|
last_iff_raise_ticks = 0;
|
|
3025
2995
|
last_iff = 0;
|
|
3026
2996
|
sound = null;
|
|
2997
|
+
sound_factory;
|
|
3027
2998
|
instructions_per_millisecond = 0;
|
|
3028
2999
|
ticks_per_millisecond = 0;
|
|
3029
3000
|
FREQ = 1780000;
|
|
@@ -3053,15 +3024,16 @@ class Runner {
|
|
|
3053
3024
|
this.last_iff = iff;
|
|
3054
3025
|
}
|
|
3055
3026
|
init_sound(enabled) {
|
|
3056
|
-
if (enabled && this.sound == null) {
|
|
3057
|
-
this.sound =
|
|
3027
|
+
if (enabled && this.sound == null && this.sound_factory) {
|
|
3028
|
+
this.sound = this.sound_factory();
|
|
3058
3029
|
console.log("\u0437\u0432\u0443\u043A \u0432\u043A\u043B\u044E\u0447\u0435\u043D");
|
|
3059
3030
|
} else if (!enabled) {
|
|
3060
3031
|
this.sound = null;
|
|
3061
3032
|
console.log("\u0437\u0432\u0443\u043A \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D");
|
|
3062
3033
|
}
|
|
3063
3034
|
}
|
|
3064
|
-
execute() {
|
|
3035
|
+
execute(options = {}) {
|
|
3036
|
+
const { terminate_address, on_terminate, exit_on_halt } = options;
|
|
3065
3037
|
clearTimeout(this.execute_timer);
|
|
3066
3038
|
if (!this.paused) {
|
|
3067
3039
|
let batch_ticks = 0;
|
|
@@ -3089,6 +3061,14 @@ class Runner {
|
|
|
3089
3061
|
this.machine.ui.on_visualizer_hit(this.machine.memory.read_raw(this.machine.cpu.pc));
|
|
3090
3062
|
}
|
|
3091
3063
|
batch_instructions += 1;
|
|
3064
|
+
if (terminate_address !== undefined && this.machine.cpu.pc === terminate_address) {
|
|
3065
|
+
on_terminate?.();
|
|
3066
|
+
return;
|
|
3067
|
+
}
|
|
3068
|
+
if (exit_on_halt && this.machine.memory.read_raw(this.machine.cpu.pc) === 118) {
|
|
3069
|
+
on_terminate?.();
|
|
3070
|
+
return;
|
|
3071
|
+
}
|
|
3092
3072
|
}
|
|
3093
3073
|
const now = performance.now();
|
|
3094
3074
|
const elapsed = now - this.previous_batch_time;
|
|
@@ -3096,7 +3076,7 @@ class Runner {
|
|
|
3096
3076
|
this.instructions_per_millisecond = batch_instructions / elapsed;
|
|
3097
3077
|
this.ticks_per_millisecond = batch_ticks / elapsed;
|
|
3098
3078
|
}
|
|
3099
|
-
this.execute_timer = setTimeout(() => this.execute(), 10);
|
|
3079
|
+
this.execute_timer = setTimeout(() => this.execute(options), 10);
|
|
3100
3080
|
}
|
|
3101
3081
|
pause() {
|
|
3102
3082
|
this.paused = true;
|
|
@@ -3110,7 +3090,7 @@ class Runner {
|
|
|
3110
3090
|
}
|
|
3111
3091
|
}
|
|
3112
3092
|
|
|
3113
|
-
// src/lib/rk86_screen.ts
|
|
3093
|
+
// src/lib/core/rk86_screen.ts
|
|
3114
3094
|
class Screen {
|
|
3115
3095
|
static #update_rate = 40;
|
|
3116
3096
|
machine;
|
|
@@ -3127,6 +3107,7 @@ class Screen {
|
|
|
3127
3107
|
light_pen_active;
|
|
3128
3108
|
video_memory_base = 0;
|
|
3129
3109
|
video_memory_size = 0;
|
|
3110
|
+
ready = false;
|
|
3130
3111
|
renderer;
|
|
3131
3112
|
constructor(machine) {
|
|
3132
3113
|
this.machine = machine;
|
|
@@ -3185,11 +3166,12 @@ class Screen {
|
|
|
3185
3166
|
this.render_loop();
|
|
3186
3167
|
}
|
|
3187
3168
|
render_loop() {
|
|
3188
|
-
this.
|
|
3169
|
+
if (this.ready)
|
|
3170
|
+
this.renderer.update();
|
|
3189
3171
|
setTimeout(() => this.render_loop(), Screen.#update_rate);
|
|
3190
3172
|
}
|
|
3191
|
-
last_width =
|
|
3192
|
-
last_height =
|
|
3173
|
+
last_width = -1;
|
|
3174
|
+
last_height = -1;
|
|
3193
3175
|
set_geometry(width, height) {
|
|
3194
3176
|
this.width = width;
|
|
3195
3177
|
this.height = height;
|
|
@@ -3200,8 +3182,10 @@ class Screen {
|
|
|
3200
3182
|
console.log(`\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u0440\u0430\u0437\u043C\u0435\u0440 \u044D\u043A\u0440\u0430\u043D\u0430: ${width} x ${height}`);
|
|
3201
3183
|
this.last_width = this.width;
|
|
3202
3184
|
this.last_height = this.height;
|
|
3185
|
+
if (this.last_video_memory_base !== -1)
|
|
3186
|
+
this.ready = true;
|
|
3203
3187
|
}
|
|
3204
|
-
last_video_memory_base =
|
|
3188
|
+
last_video_memory_base = -1;
|
|
3205
3189
|
set_video_memory(base) {
|
|
3206
3190
|
this.video_memory_base = base;
|
|
3207
3191
|
this.machine.ui.update_video_memory_address(this.video_memory_base);
|
|
@@ -3209,6 +3193,8 @@ class Screen {
|
|
|
3209
3193
|
return;
|
|
3210
3194
|
console.log(`\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0430 \u0432\u0438\u0434\u0435\u043E\u043F\u0430\u043C\u044F\u0442\u044C \u0441 \u0430\u0434\u0440\u0435\u0441\u0430`, `${hex16(this.video_memory_base)}`, `\u0440\u0430\u0437\u043C\u0435\u0440\u043E\u043C ${hex16(this.video_memory_size)}`);
|
|
3211
3195
|
this.last_video_memory_base = this.video_memory_base;
|
|
3196
|
+
if (this.last_width !== -1)
|
|
3197
|
+
this.ready = true;
|
|
3212
3198
|
}
|
|
3213
3199
|
set_cursor(x, y) {
|
|
3214
3200
|
this.cursor_x = x;
|
|
@@ -3220,7 +3206,7 @@ class Screen {
|
|
|
3220
3206
|
}
|
|
3221
3207
|
}
|
|
3222
3208
|
|
|
3223
|
-
// src/lib/rk86_snapshot.ts
|
|
3209
|
+
// src/lib/core/rk86_snapshot.ts
|
|
3224
3210
|
function rk86_snapshot_restore(snapshot, machine, keys_injector) {
|
|
3225
3211
|
try {
|
|
3226
3212
|
const json = typeof snapshot === "string" ? JSON.parse(snapshot) : snapshot;
|
|
@@ -3243,7 +3229,7 @@ function rk86_snapshot_restore(snapshot, machine, keys_injector) {
|
|
|
3243
3229
|
}
|
|
3244
3230
|
}
|
|
3245
3231
|
|
|
3246
|
-
// src/lib/
|
|
3232
|
+
// src/lib/web/tape.ts
|
|
3247
3233
|
class Tape {
|
|
3248
3234
|
machine;
|
|
3249
3235
|
previous_bit_ticks = 0;
|
|
@@ -3344,7 +3330,7 @@ class Tape {
|
|
|
3344
3330
|
}
|
|
3345
3331
|
}
|
|
3346
3332
|
|
|
3347
|
-
// src/lib/rk86_terminal.ts
|
|
3333
|
+
// src/lib/terminal/rk86_terminal.ts
|
|
3348
3334
|
var charMap = {
|
|
3349
3335
|
0: " ",
|
|
3350
3336
|
1: "\u2598",
|
|
@@ -3512,6 +3498,8 @@ class IO {
|
|
|
3512
3498
|
|
|
3513
3499
|
class TerminalRenderer {
|
|
3514
3500
|
machine;
|
|
3501
|
+
loadInfo = "";
|
|
3502
|
+
loadInfoPrinted = false;
|
|
3515
3503
|
connect(machine) {
|
|
3516
3504
|
this.machine = machine;
|
|
3517
3505
|
}
|
|
@@ -3541,6 +3529,11 @@ class TerminalRenderer {
|
|
|
3541
3529
|
}
|
|
3542
3530
|
output += `${dim}\u2514${"\u2500".repeat(w)}\u2518${reset}
|
|
3543
3531
|
`;
|
|
3532
|
+
if (this.loadInfo && !this.loadInfoPrinted && screen.video_memory_base > 0) {
|
|
3533
|
+
output += this.loadInfo + `
|
|
3534
|
+
`;
|
|
3535
|
+
this.loadInfoPrinted = true;
|
|
3536
|
+
}
|
|
3544
3537
|
process.stdout.write(output);
|
|
3545
3538
|
}
|
|
3546
3539
|
}
|
|
@@ -3657,17 +3650,22 @@ function printHelp() {
|
|
|
3657
3650
|
\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: bunx rk86 [\u043E\u043F\u0446\u0438\u0438] [\u0444\u0430\u0439\u043B]
|
|
3658
3651
|
|
|
3659
3652
|
\u041E\u043F\u0446\u0438\u0438:
|
|
3660
|
-
-
|
|
3661
|
-
-
|
|
3662
|
-
-
|
|
3663
|
-
-
|
|
3653
|
+
-v \u0432\u0435\u0440\u0441\u0438\u044F
|
|
3654
|
+
-h \u0441\u043F\u0440\u0430\u0432\u043A\u0430
|
|
3655
|
+
-l \u0441\u043F\u0438\u0441\u043E\u043A \u0444\u0430\u0439\u043B\u043E\u0432 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430
|
|
3656
|
+
-m <\u0444\u0430\u0439\u043B> \u043C\u043E\u043D\u0438\u0442\u043E\u0440 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E: \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 mon32.bin)
|
|
3657
|
+
-p \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0444\u0430\u0439\u043B \u0431\u0435\u0437 \u0437\u0430\u043F\u0443\u0441\u043A\u0430
|
|
3658
|
+
--exit-halt \u0432\u044B\u0445\u043E\u0434 \u043F\u0440\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0438 HLT
|
|
3659
|
+
--exit-address [\u0430\u0434\u0440\u0435\u0441] \u0432\u044B\u0445\u043E\u0434 \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0435 \u043D\u0430 \u0430\u0434\u0440\u0435\u0441 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E: 0xFFFE)
|
|
3664
3660
|
|
|
3665
3661
|
\u041F\u0440\u0438\u043C\u0435\u0440\u044B:
|
|
3666
|
-
bunx rk86
|
|
3667
|
-
bunx rk86 CHESS.GAM
|
|
3668
|
-
bunx rk86 -p CHESS.GAM
|
|
3669
|
-
bunx rk86 -m mon16.bin
|
|
3670
|
-
bunx rk86 -
|
|
3662
|
+
bunx rk86 \u0437\u0430\u043F\u0443\u0441\u043A \u043C\u043E\u043D\u0438\u0442\u043E\u0440\u0430
|
|
3663
|
+
bunx rk86 CHESS.GAM \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0438 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0444\u0430\u0439\u043B
|
|
3664
|
+
bunx rk86 -p CHESS.GAM \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0444\u0430\u0439\u043B (\u0431\u0435\u0437 \u0437\u0430\u043F\u0443\u0441\u043A\u0430)
|
|
3665
|
+
bunx rk86 -m mon16.bin \u0437\u0430\u043F\u0443\u0441\u043A \u0441 \u0434\u0440\u0443\u0433\u0438\u043C \u043C\u043E\u043D\u0438\u0442\u043E\u0440\u043E\u043C
|
|
3666
|
+
bunx rk86 --exit-halt prog.bin \u0432\u044B\u0445\u043E\u0434 \u043F\u0440\u0438 HLT
|
|
3667
|
+
bunx rk86 --exit-address prog.bin \u0432\u044B\u0445\u043E\u0434 \u043F\u0440\u0438 JMP FFFEh
|
|
3668
|
+
bunx rk86 -l \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0445 \u0444\u0430\u0439\u043B\u043E\u0432
|
|
3671
3669
|
|
|
3672
3670
|
\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435:
|
|
3673
3671
|
Ctrl+C \u0432\u044B\u0445\u043E\u0434`);
|
|
@@ -3683,21 +3681,46 @@ async function listFiles() {
|
|
|
3683
3681
|
console.log(`\x1B[33m${entry.name.padEnd(20)}\x1B[0m ${title}${desc}`);
|
|
3684
3682
|
}
|
|
3685
3683
|
}
|
|
3684
|
+
function flag(args, name) {
|
|
3685
|
+
const i = args.indexOf(name);
|
|
3686
|
+
if (i == -1)
|
|
3687
|
+
return false;
|
|
3688
|
+
args.splice(i, 1);
|
|
3689
|
+
return true;
|
|
3690
|
+
}
|
|
3691
|
+
function arg(args, name, defaultValue, matcher, convertor) {
|
|
3692
|
+
const convert = (v) => convertor ? convertor(v) : v;
|
|
3693
|
+
const i = args.indexOf(name);
|
|
3694
|
+
if (i == -1)
|
|
3695
|
+
return;
|
|
3696
|
+
if (i + 1 >= args.length || matcher && !matcher.test(args[i + 1])) {
|
|
3697
|
+
args.splice(i, 1);
|
|
3698
|
+
return defaultValue ? convert(defaultValue) : defaultValue;
|
|
3699
|
+
}
|
|
3700
|
+
const value = args[i + 1];
|
|
3701
|
+
args.splice(i, 2);
|
|
3702
|
+
return convert(value);
|
|
3703
|
+
}
|
|
3686
3704
|
async function main() {
|
|
3687
3705
|
const args = process.argv.slice(2);
|
|
3688
|
-
if (args
|
|
3706
|
+
if (flag(args, "-v") || flag(args, "--version")) {
|
|
3707
|
+
console.log(`rk86 ${package_default.version}`);
|
|
3708
|
+
process.exit(0);
|
|
3709
|
+
}
|
|
3710
|
+
if (flag(args, "-h") || flag(args, "--help")) {
|
|
3689
3711
|
printHelp();
|
|
3690
3712
|
process.exit(0);
|
|
3691
3713
|
}
|
|
3692
|
-
if (args
|
|
3714
|
+
if (flag(args, "-l") || flag(args, "--list")) {
|
|
3693
3715
|
await listFiles();
|
|
3694
3716
|
process.exit(0);
|
|
3695
3717
|
}
|
|
3696
|
-
const loadOnly = args
|
|
3697
|
-
const
|
|
3698
|
-
const
|
|
3699
|
-
const
|
|
3700
|
-
const
|
|
3718
|
+
const loadOnly = flag(args, "-p");
|
|
3719
|
+
const exitOnHalt = flag(args, "--exit-halt");
|
|
3720
|
+
const exitAddrValue = arg(args, "--exit-address", "0xFFFE", /^0x[0-9a-fA-F]+$/i, (v) => parseInt(v, 16));
|
|
3721
|
+
const exitAddr = exitAddrValue !== undefined;
|
|
3722
|
+
const monitorFile_ = arg(args, "-m");
|
|
3723
|
+
const programFile = args[0];
|
|
3701
3724
|
const keyboard = new Keyboard;
|
|
3702
3725
|
const io = new IO;
|
|
3703
3726
|
const machineBuilder = {
|
|
@@ -3717,25 +3740,38 @@ async function main() {
|
|
|
3717
3740
|
const monitorFile = parse_rk86_binary(monitorFile_ || "mon32.bin", monitorContent);
|
|
3718
3741
|
machine.memory.load_file(monitorFile);
|
|
3719
3742
|
let entryPoint;
|
|
3743
|
+
let loadInfo = "";
|
|
3720
3744
|
if (programFile) {
|
|
3721
3745
|
const content = await fetchFile(programFile);
|
|
3722
3746
|
const { ok, json } = parse(content);
|
|
3723
3747
|
if (ok) {
|
|
3724
3748
|
rk86_snapshot_restore(json, machine);
|
|
3725
3749
|
entryPoint = parseInt(json.cpu.pc);
|
|
3726
|
-
|
|
3750
|
+
loadInfo = `\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D: ${programFile} (PC=${hex16(entryPoint)})`;
|
|
3727
3751
|
} else {
|
|
3728
3752
|
const file = parse_rk86_binary(programFile, content);
|
|
3729
3753
|
machine.memory.load_file(file);
|
|
3730
3754
|
entryPoint = file.entry;
|
|
3731
|
-
|
|
3755
|
+
loadInfo = `\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D: ${programFile} (${hex16(file.start)}-${hex16(file.end)}, G${hex16(file.entry)})`;
|
|
3732
3756
|
}
|
|
3733
3757
|
}
|
|
3734
3758
|
process.stdout.write("\x1B[?25l");
|
|
3735
3759
|
process.stdout.write("\x1B[2J");
|
|
3736
3760
|
setupKeyboard(keyboard);
|
|
3737
|
-
|
|
3738
|
-
|
|
3761
|
+
const renderer = new TerminalRenderer;
|
|
3762
|
+
renderer.loadInfo = loadInfo;
|
|
3763
|
+
machine.screen.start(renderer);
|
|
3764
|
+
const onTerminate = exitOnHalt || exitAddr ? () => {
|
|
3765
|
+
renderer.update();
|
|
3766
|
+
console.log();
|
|
3767
|
+
console.log("\u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0430 \u0440\u0430\u0431\u043E\u0442\u0443 \u043D\u0430", hex16(machine.cpu.pc));
|
|
3768
|
+
process.exit(0);
|
|
3769
|
+
} : undefined;
|
|
3770
|
+
machine.runner.execute({
|
|
3771
|
+
terminate_address: exitAddr ? exitAddrValue : undefined,
|
|
3772
|
+
exit_on_halt: exitOnHalt,
|
|
3773
|
+
on_terminate: onTerminate
|
|
3774
|
+
});
|
|
3739
3775
|
if (entryPoint !== undefined && !loadOnly) {
|
|
3740
3776
|
setTimeout(() => machine.cpu.jump(entryPoint), 500);
|
|
3741
3777
|
}
|