rk86 2.0.24 → 2.0.26
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 +109 -9
package/package.json
CHANGED
package/rk86.js
CHANGED
|
@@ -2951,6 +2951,18 @@ var init_catalog_data = __esm(() => {
|
|
|
2951
2951
|
checkSum: 64981,
|
|
2952
2952
|
leadingE6: false
|
|
2953
2953
|
},
|
|
2954
|
+
{
|
|
2955
|
+
name: "mon32-trans.bin",
|
|
2956
|
+
title: "\u041C\u043E\u043D\u0438\u0442\u043E\u0440 32\u041A\u0411 \u0441 \u0432\u043A\u043B\u044E\u0447\u0451\u043D\u043D\u044B\u043C transparent field-attribute mode (i8275 reset byte 4 = 0x93). \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0434\u043B\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043D\u043D\u044B\u0445 \u043D\u0430 \u044D\u0442\u043E\u0442 \u0440\u0435\u0436\u0438\u043C (`tree2025.rk`). \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 URL-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 `?monitor=mon32-trans.bin`.",
|
|
2957
|
+
description: "",
|
|
2958
|
+
screenshots: [],
|
|
2959
|
+
start: 0,
|
|
2960
|
+
end: 2047,
|
|
2961
|
+
size: 2048,
|
|
2962
|
+
entry: 0,
|
|
2963
|
+
checkSum: 4565,
|
|
2964
|
+
leadingE6: false
|
|
2965
|
+
},
|
|
2954
2966
|
{
|
|
2955
2967
|
name: "mon32.bin",
|
|
2956
2968
|
title: '\u041E\u0440\u0438\u0433\u0438\u043D\u0430\u043B\u044C\u043D\u044B\u0439 <a href="https://github.com/begoon/rk86-maximite/blob/master/monitor/monitor32.asm">\u041C\u043E\u043D\u0438\u0442\u043E\u0440 32\u041A\u0411</a>',
|
|
@@ -2960,7 +2972,7 @@ var init_catalog_data = __esm(() => {
|
|
|
2960
2972
|
end: 2047,
|
|
2961
2973
|
size: 2048,
|
|
2962
2974
|
entry: 0,
|
|
2963
|
-
checkSum:
|
|
2975
|
+
checkSum: 21013,
|
|
2964
2976
|
leadingE6: false
|
|
2965
2977
|
},
|
|
2966
2978
|
{
|
|
@@ -4083,7 +4095,7 @@ import { basename } from "path";
|
|
|
4083
4095
|
// packages/rk86/package.json
|
|
4084
4096
|
var package_default = {
|
|
4085
4097
|
name: "rk86",
|
|
4086
|
-
version: "2.0.
|
|
4098
|
+
version: "2.0.25",
|
|
4087
4099
|
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",
|
|
4088
4100
|
bin: {
|
|
4089
4101
|
rk86: "rk86.js"
|
|
@@ -5427,6 +5439,7 @@ class Memory {
|
|
|
5427
5439
|
this.video_screen_size_y = this.video_screen_size_y_buf;
|
|
5428
5440
|
this.machine.screen.set_geometry(this.video_screen_size_x, this.video_screen_size_y);
|
|
5429
5441
|
}
|
|
5442
|
+
this.machine.screen.transparent_attr = (byte & 64) === 0;
|
|
5430
5443
|
return;
|
|
5431
5444
|
}
|
|
5432
5445
|
if (vt57_reg === 57352 && byte === 128) {
|
|
@@ -5634,6 +5647,7 @@ class Screen {
|
|
|
5634
5647
|
light_pen_active;
|
|
5635
5648
|
video_memory_base = 0;
|
|
5636
5649
|
video_memory_size = 0;
|
|
5650
|
+
transparent_attr = false;
|
|
5637
5651
|
ready = false;
|
|
5638
5652
|
renderer;
|
|
5639
5653
|
constructor(machine) {
|
|
@@ -6056,22 +6070,104 @@ class TerminalRenderer {
|
|
|
6056
6070
|
const dim = "\x1B[2m";
|
|
6057
6071
|
const reset = "\x1B[0m";
|
|
6058
6072
|
const w = screen.width;
|
|
6073
|
+
const ANSI_FG = ["37", "33", "35", "31", "36", "32", "34", "30"];
|
|
6059
6074
|
let output = "\x1B[H";
|
|
6060
6075
|
output += `${dim}\u250C${"\u2500".repeat(w)}\u2510${reset}
|
|
6061
6076
|
`;
|
|
6077
|
+
const transparent = screen.transparent_attr;
|
|
6078
|
+
const blinkOff = Math.floor(Date.now() / 320) % 2 === 1;
|
|
6079
|
+
const FA_PENDING = -1;
|
|
6062
6080
|
let addr = screen.video_memory_base;
|
|
6081
|
+
let frameStopped = false;
|
|
6082
|
+
let color = 0;
|
|
6083
|
+
let blink = false;
|
|
6063
6084
|
for (let y = 0;y < screen.height; y++) {
|
|
6064
6085
|
let line = `${dim}\u2502${reset}`;
|
|
6086
|
+
const cells = new Array(w);
|
|
6087
|
+
if (transparent) {
|
|
6088
|
+
const fifo = [];
|
|
6089
|
+
let fifoFlag = false;
|
|
6090
|
+
let cellCount = 0;
|
|
6091
|
+
let rowStopped = frameStopped;
|
|
6092
|
+
let bytesFetched = 0;
|
|
6093
|
+
while (cellCount < w && !rowStopped) {
|
|
6094
|
+
const raw = memory.read(addr + bytesFetched);
|
|
6095
|
+
bytesFetched++;
|
|
6096
|
+
if (fifoFlag) {
|
|
6097
|
+
fifo.push(raw);
|
|
6098
|
+
fifoFlag = false;
|
|
6099
|
+
continue;
|
|
6100
|
+
}
|
|
6101
|
+
if (raw >= 240) {
|
|
6102
|
+
cells[cellCount++] = { ch: 0, color, blink };
|
|
6103
|
+
rowStopped = true;
|
|
6104
|
+
if (raw >= 248)
|
|
6105
|
+
frameStopped = true;
|
|
6106
|
+
} else if (raw >= 192) {
|
|
6107
|
+
cells[cellCount++] = { ch: 0, color, blink };
|
|
6108
|
+
} else if (raw >= 128) {
|
|
6109
|
+
color = (raw & 1) << 2 | (raw & 12) >> 2;
|
|
6110
|
+
blink = (raw & 2) !== 0;
|
|
6111
|
+
cells[cellCount++] = { ch: FA_PENDING, color, blink };
|
|
6112
|
+
fifoFlag = true;
|
|
6113
|
+
} else {
|
|
6114
|
+
cells[cellCount++] = { ch: raw, color, blink };
|
|
6115
|
+
}
|
|
6116
|
+
}
|
|
6117
|
+
while (cellCount < w)
|
|
6118
|
+
cells[cellCount++] = { ch: 0, color, blink };
|
|
6119
|
+
let fifoIdx = 0;
|
|
6120
|
+
for (let x = 0;x < w; ++x) {
|
|
6121
|
+
if (cells[x].ch === FA_PENDING) {
|
|
6122
|
+
cells[x].ch = (fifo[fifoIdx] ?? 0) & 127;
|
|
6123
|
+
fifoIdx++;
|
|
6124
|
+
}
|
|
6125
|
+
}
|
|
6126
|
+
addr += bytesFetched;
|
|
6127
|
+
if (addr - screen.video_memory_base < (y + 1) * w) {
|
|
6128
|
+
addr = screen.video_memory_base + (y + 1) * w;
|
|
6129
|
+
}
|
|
6130
|
+
} else {
|
|
6131
|
+
let rowStopped = frameStopped;
|
|
6132
|
+
for (let x = 0;x < w; x++) {
|
|
6133
|
+
const raw = memory.read(addr + x);
|
|
6134
|
+
let ch;
|
|
6135
|
+
if (rowStopped) {
|
|
6136
|
+
ch = 0;
|
|
6137
|
+
} else if (raw >= 240) {
|
|
6138
|
+
ch = 0;
|
|
6139
|
+
rowStopped = true;
|
|
6140
|
+
if (raw >= 248)
|
|
6141
|
+
frameStopped = true;
|
|
6142
|
+
} else if (raw >= 192) {
|
|
6143
|
+
ch = 0;
|
|
6144
|
+
} else if (raw >= 128) {
|
|
6145
|
+
color = (raw & 1) << 2 | (raw & 12) >> 2;
|
|
6146
|
+
blink = (raw & 2) !== 0;
|
|
6147
|
+
ch = 0;
|
|
6148
|
+
} else {
|
|
6149
|
+
ch = raw;
|
|
6150
|
+
}
|
|
6151
|
+
cells[x] = { ch, color, blink };
|
|
6152
|
+
}
|
|
6153
|
+
addr += w;
|
|
6154
|
+
}
|
|
6155
|
+
let prevColor = -1;
|
|
6065
6156
|
for (let x = 0;x < w; x++) {
|
|
6066
|
-
const
|
|
6157
|
+
const cell = cells[x];
|
|
6158
|
+
const ch = cell.blink && blinkOff ? 0 : cell.ch;
|
|
6159
|
+
const glyph = rk86char(ch);
|
|
6160
|
+
if (cell.color !== prevColor) {
|
|
6161
|
+
line += `\x1B[${ANSI_FG[cell.color]}m`;
|
|
6162
|
+
prevColor = cell.color;
|
|
6163
|
+
}
|
|
6067
6164
|
if (x === screen.cursor_x && y === screen.cursor_y) {
|
|
6068
|
-
line += `\x1B[4m${
|
|
6165
|
+
line += `\x1B[4m${glyph}\x1B[24m`;
|
|
6069
6166
|
} else {
|
|
6070
|
-
line +=
|
|
6167
|
+
line += glyph;
|
|
6071
6168
|
}
|
|
6072
|
-
addr++;
|
|
6073
6169
|
}
|
|
6074
|
-
line += `${dim}\u2502${reset}`;
|
|
6170
|
+
line += `${reset}${dim}\u2502${reset}`;
|
|
6075
6171
|
output += line + `
|
|
6076
6172
|
`;
|
|
6077
6173
|
}
|
|
@@ -6196,7 +6292,7 @@ function setupKeyboard(keyboard) {
|
|
|
6196
6292
|
}
|
|
6197
6293
|
});
|
|
6198
6294
|
}
|
|
6199
|
-
var MON32_B64 = "wzb4w2P+w5j7w7r8w0b8w7r8wwH+w6X8wyL5w3L+w3v6w3/
|
|
6295
|
+
var MON32_B64 = "wzb4w2P+w5j7w7r8w0b8w7r8wwH+w6X8wyL5w3L+w3v6w3/6w7b6w0n7wxb7" + "w876w1L/w1b/PooyA4Axz3bNzvohAHYRX3YOAM3t+SHPdiIcdiFa/80i+c3O" + "+iH/dSIxdiEqHSIvdj7DMiZ2Mc92IWb/zSL5MgKAPTICoM3u+CFs+OUhM3Z+" + "/ljK0//+VcoA8PXNLPkqK3ZNRCopdusqJ3bx/kTKxfn+Q8rX+f5Gyu35/lPK" + "9Pn+VMr/+f5Nyib6/kfKP/r+ScqG+v5Pyi37/kzKCPr+Uspo+sMA8D4zvcrx" + "+OUhnv/NIvnhK8Pz+CEzdgYAzWP+/gjK3Pj+f8rc+MS5/Hf+Dcoa+f4uymz4" + "Bv8+Ur3Krvojw/P4eBcRM3YGAMl+p8jNufwjwyL5ISd2ES12DgDN7fkRNHbN" + "WvkiJ3YiKXbYPv8yLXbNWvkiKXbYzVr5Iit22MOu+iEAABoT/g3Kjvn+LMj+" + "IMpd+dYw+q76/gr6gvn+Efqu+v4X8q761gdPKSkpKdqu+gnDXfk3yXy6wH27" + "yc2k+c2Q+cKi+TMzySPJzXL+/gPAzc76w6765SFs/80i+eHJfsXNpfw+IM25" + "/MHJzXj7zbn5zZb5feYPysX5w8j5Cr7K5vnNePvNufkKzbr5A82W+cPX+XHN" + "mfnD7fl5vsx4+82W+cP0+X4CA82Z+cP/+c14+363+hX6/iDSF/o+Ls25/M2W" + "+X3mD8oI+sML+s14+825+eXN7vjh0jv65c1a+X3hdyPDJvrNkPnKWvrrIiN2" + "fjIldjb3PsMyMAAhov8iMQAxGHbB0eHx+SoWdsMmdj6QMgOgIgGgOgCgAgPN" + "mfnDbfoqAnbJ5SoAdn7hyTotdrfKkfp7Mi92zbb6zXj76814++vFzRb7YGnN" + "ePvRzZD5yOvNePs+P825/MNs+D7/zf/65Qnrzf364Qnr5c0K+z7/zf/64eUh" + "AcA2ACs2TTYdNpk2kyM2J35+5iDK4fohCOA2gC4ENtA2diw2IzZJLgg2pOHJ" + "PgjNmPtHPgjNmPtPyT4IzZj7d82Z+cMK+wEAAH6BT/XNkPnKn/nxeI5HzZn5" + "wxn7ebfKNfsyMHblzRb74c14++vNePvr5WBpzXj74cUBAADNRvwF4+PCTfsO" + "5s1G/M2Q++vNkPvrzYb7IQAAzZD7DubNRvzhzZD7w876xc2w+XzNpfx9zbr5" + "wclOzUb8zZn5w4b7TM1G/E3DRvzlxdVXPoAyCOAhAAA5MQAAIg12DgA6AoAP" + "Dw8P5gFf8XnmfwdPJgAlyjT88ToCgA8PDw/mAbvKv/uxTxU6L3bC3PvWEkfx" + "BcLd+xQ6AoAPDw8P5gFferfyC/x5/ubC//uvMi52wwn8/hnCt/s+/zIudhYJ" + "FcK3+yEE4DbQNnYjNiM2ST4nMgHAPuAyAcAuCDakKg12+ToudqnDofwqDXb5" + "zc76erfyrvrNpPnDnPvlxdX1PoAyCOAhAAA5MQAAFgjxeQdPPgGpMgKAOjB2" + "R/EFwmb8PgCpMgKAFTowdsJ6/NYOR/EFwnv8FBXCWPz5IQTgNtA2diM2IzZJ" + "PicyAcA+4DIBwC4INqTx0cHhyfUPDw8Pza788eYP/gr6t/zGB8YwT/XF1eXN" + "Af4hhf3lKgJ26yoAdjoEdj367vzKZf3ic/151iBPDfrp/MXNuf3Bw938rzIE" + "dsl55n9P/h/Ko/3+DMqy/f4NyvP9/grKR/3+CMrW/f4Yyrn9/hnK4v3+GsrF" + "/f4byp79/gfCOP0B8AV4+z3CKP148z3CLv0Nwif9yXHNuf16/gPAe/4IwM3i" + "/Xr+G8LF/eXVIcJ3ERB4AZ4HGncjEwt5sMJY/dHhyXn+WcLp/M2y/T4Cw+r8" + "edYgTw0+BPrq/MXNxf3Bw3f9IgB26yICdj6AMgHAfTIAwHwyAMDh0cHxyT4B" + "w+r8IfR/ESUJr3crG3uywqn9EQgDIcJ3yXsjHP5HwB4IAcD/CXr+GwFOAMLT" + "/RYCAbD4FAnJeysd/gjAHkcBQAAJev4DAbL/wvD9FhwBUAcVCcl9k9L5/SVv" + "HggBCAAJyToCgOaAyg7+OgV2t8DlKgl2zXL+vW/KKv4+ATILdiYVryIJduEy" + "BXbJJcIh/jzKIv48ylH+xQEDUM0n/cE6C3Ym4D0yC3bKTP4mQD7/wyL+OgKA" + "5oDKUf46BnYvMgZ2wxr+zQH+t8pj/q8yBXY6CXbJOgKA5oDCff4+/smvMgCA" + "MgKAOgZ25gH2BjIDgDoBgDzCl/49yeUuASYHfQ9vLzIAgDoBgC+3wrP+JfKc" + "/j7/4ckuIDoBgC+3yq/+LcK1/i4ILQfSw/58ZW/+Acr6/trz/gcHB8YgtP5f" + "wgb/PiDhyQkKDX8IGRgaDB8bAAECAwQFfCHq/sP+/nwh4v6Fb37+QOHY5W86" + "AoBn5kDCGv99/kD6P//mH+HJOgZ2t8oq/33+QPoq//Ygb3zmIMI//33+QPo7" + "/33uIOHJfeYvb33+QOHw5W/mD/4MffpQ/+4Q4ckqMXbJIjF2yR9yYWRpby04" + "NnJrAA0KLS0+AA0KGBgYGAANCiBQQy0NCiBITC0NCiBCQy0NCiBERS0NCiBT" + "UC0NCiBBRi0ZGRkZGRkACCAIACIWdvXhIh524SsiFHYhAAA5MR525dXFKhR2" + "Mc92zXj76yojds2Q+cJs+DoldnfDbPghc//NIvkhFHYGBl4jVsXl6814+83u" + "+NL2/81a+dHV63Irc+HBBSPC3v/J//8=";
|
|
6200
6296
|
function decodeMon32() {
|
|
6201
6297
|
return Array.from(new Uint8Array(Uint8Array.from(atob(MON32_B64), (c) => c.charCodeAt(0))));
|
|
6202
6298
|
}
|
|
@@ -6512,7 +6608,7 @@ function dumpScreen(machine) {
|
|
|
6512
6608
|
let rowStopped = frameStopped;
|
|
6513
6609
|
for (let x = 0;x < screen.width; x++) {
|
|
6514
6610
|
const raw = memory.read_raw(addr++);
|
|
6515
|
-
if (rowStopped || raw >=
|
|
6611
|
+
if (rowStopped || raw >= 192) {
|
|
6516
6612
|
line += ".";
|
|
6517
6613
|
if (raw >= 240)
|
|
6518
6614
|
rowStopped = true;
|
|
@@ -6520,6 +6616,10 @@ function dumpScreen(machine) {
|
|
|
6520
6616
|
frameStopped = true;
|
|
6521
6617
|
continue;
|
|
6522
6618
|
}
|
|
6619
|
+
if (raw >= 128) {
|
|
6620
|
+
line += ".";
|
|
6621
|
+
continue;
|
|
6622
|
+
}
|
|
6523
6623
|
const byte = raw & 127;
|
|
6524
6624
|
if (byte === 0 || byte === 9 || byte === 10 || byte === 13) {
|
|
6525
6625
|
line += ".";
|