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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/rk86.js +133 -97
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rk86",
3
- "version": "2.0.11",
3
+ "version": "2.0.13",
4
4
  "description": "Эмулятор Радио-86РК (Intel 8080) для терминала",
5
5
  "bin": {
6
6
  "rk86": "rk86.js"
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/SoundPlayer.ts
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 = new 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.renderer.update();
3169
+ if (this.ready)
3170
+ this.renderer.update();
3189
3171
  setTimeout(() => this.render_loop(), Screen.#update_rate);
3190
3172
  }
3191
- last_width = 0;
3192
- last_height = 0;
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 = 0;
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/rk86_tape.ts
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
- -h \u0441\u043F\u0440\u0430\u0432\u043A\u0430
3661
- -l \u0441\u043F\u0438\u0441\u043E\u043A \u0444\u0430\u0439\u043B\u043E\u0432 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430
3662
- -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)
3663
- -p \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0444\u0430\u0439\u043B \u0431\u0435\u0437 \u0437\u0430\u043F\u0443\u0441\u043A\u0430
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 \u0437\u0430\u043F\u0443\u0441\u043A \u043C\u043E\u043D\u0438\u0442\u043E\u0440\u0430
3667
- 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
3668
- 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)
3669
- 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
3670
- bunx rk86 -l \u0441\u043F\u0438\u0441\u043E\u043A \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0444\u0430\u0439\u043B\u043E\u0432
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.includes("-h") || args.includes("--help")) {
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.includes("-l") || args.includes("--list")) {
3714
+ if (flag(args, "-l") || flag(args, "--list")) {
3693
3715
  await listFiles();
3694
3716
  process.exit(0);
3695
3717
  }
3696
- const loadOnly = args.includes("-p");
3697
- const monitorIdx = args.indexOf("-m");
3698
- const monitorFile_ = monitorIdx >= 0 ? args[monitorIdx + 1] : undefined;
3699
- const positional = args.filter((a, i) => !a.startsWith("-") && (monitorIdx < 0 || i !== monitorIdx + 1));
3700
- const programFile = positional[0];
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
- console.error(`\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D \u043E\u0431\u0440\u0430\u0437: ${programFile} (PC=${entryPoint.toString(16)})`);
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
- console.error(`\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D: ${programFile} (${file.start.toString(16)}-${file.end.toString(16)}, G${file.entry.toString(16)})`);
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
- machine.screen.start(new TerminalRenderer);
3738
- machine.runner.execute();
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
  }