rk86 2.0.0 → 2.0.2

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 +4 -2
  2. package/rk86 +3836 -0
package/rk86 ADDED
@@ -0,0 +1,3836 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+ var __defProp = Object.defineProperty;
4
+ var __returnValue = (v) => v;
5
+ function __exportSetter(name, newValue) {
6
+ this[name] = __returnValue.bind(null, newValue);
7
+ }
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, {
11
+ get: all[name],
12
+ enumerable: true,
13
+ configurable: true,
14
+ set: __exportSetter.bind(all, name)
15
+ });
16
+ };
17
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
18
+
19
+ // src/lib/catalog_data.ts
20
+ var exports_catalog_data = {};
21
+ __export(exports_catalog_data, {
22
+ catalog: () => catalog
23
+ });
24
+ var catalog;
25
+ var init_catalog_data = __esm(() => {
26
+ catalog = [
27
+ {
28
+ name: "ALIAZ1.RK",
29
+ title: "\u0418\u0433\u0440\u0430 Aliaz-1",
30
+ description: "\u0410\u0432\u0442\u043E\u0440: \u0411\u044B\u0442\u043A\u043E \u0410., \u0420\u0438\u0433\u0430, 1989.",
31
+ screenshots: [
32
+ "ALIAZ1.RK-1.png",
33
+ "ALIAZ1.RK-2.png"
34
+ ]
35
+ },
36
+ {
37
+ name: "ASM-ED.RK",
38
+ title: '\u0410\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440 \u0438 \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u041C\u0438\u043A\u0440\u043E\u043D "\u0420\u0415\u0414\u0410\u041A\u0422\u041E\u0420"',
39
+ description: '\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u0440\u0435\u0430\u043B\u044C\u043D\u043E \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442, \u0432\u044B\u0434\u0430\u0435\u0442 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 "\u041C\u0410\u041B\u041E \u041E\u0417\u0423". \u041D\u0435\u043C\u043D\u043E\u0433\u043E \u0434\u0440\u0443\u0433\u043E\u0439 \u0444\u0430\u0439\u043B (\u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043D\u0430 \u043F\u0430\u0440\u0443 \u0434\u0435\u0441\u044F\u0442\u043A\u043E\u0432 \u0431\u0430\u0439\u0442).',
40
+ screenshots: [
41
+ "ASM-ED.RK-1.png"
42
+ ]
43
+ },
44
+ {
45
+ name: "ASM_ED.RKR",
46
+ title: '\u0410\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440 \u0438 \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u041C\u0438\u043A\u0440\u043E\u043D "ED.*\u041C\u0418\u041A\u0420\u041E\u041D*"',
47
+ description: '\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u0440\u0435\u0430\u043B\u044C\u043D\u043E \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442, \u0432\u044B\u0434\u0430\u0435\u0442 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 "\u041C\u0410\u041B\u041E \u041E\u0417\u0423".',
48
+ screenshots: [
49
+ "ASM_ED.RKR-1.png"
50
+ ]
51
+ },
52
+ {
53
+ name: "ASSM_MIC.RKR",
54
+ title: "\u0410\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440 \u041C\u0438\u043A\u0440\u043E\u0448\u0430",
55
+ description: "",
56
+ screenshots: [
57
+ "ASSM_MIC.RKR-1.png"
58
+ ]
59
+ },
60
+ {
61
+ name: "BARMEN.RK",
62
+ title: "\u0418\u0433\u0440\u0430 \u0411\u0430\u0440\u043C\u0435\u043D",
63
+ description: "\u0418\u043D\u0442\u0435\u0433\u0440\u0430\u043B/\u041A\u043E\u043B\u043E\u043C\u043D\u0430, ALG, 1988.",
64
+ screenshots: [
65
+ "BARMEN.RK-1.png",
66
+ "BARMEN.RK-2.png"
67
+ ]
68
+ },
69
+ {
70
+ name: "BASIC.RK",
71
+ title: '\u0411\u0435\u0439\u0441\u0438\u043A "BASIC"',
72
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 " =>". \u0420\u0435\u0430\u043B\u044C\u043D\u043E \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442, \u0432\u044B\u0432\u0430\u043B\u0438\u0432\u0430\u0435\u0442 \u043C\u0443\u0441\u043E\u0440 \u043D\u0430 \u044D\u043A\u0440\u0430\u043D, \u043A\u0430\u043A \u043D\u0430 \u0441\u043A\u0440\u0438\u043D\u0448\u043E\u0442\u0435.',
73
+ screenshots: [
74
+ "BASIC.RK-1.png"
75
+ ]
76
+ },
77
+ {
78
+ name: "BASIC80.RKR",
79
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A *\u0420\u0410\u0414\u0418\u041E-86\u0420\u041A* BASIC",
80
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 "OK".',
81
+ screenshots: [
82
+ "BASIC80.RKR-1.png"
83
+ ]
84
+ },
85
+ {
86
+ name: "BASICMUS.RKR",
87
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A PSF BASIC 32K V3.2",
88
+ description: `\u0410\u0432\u0442\u043E\u0440 \u0410\u043D\u0430\u0448\u043A\u0438\u043D \u0410.\u0410., 24 \u0444\u0435\u0432\u0440\u0430\u043B\u044F 1987. \u041F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u0441\u0442\u0430\u0440\u0442\u0430 \u043F\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0435 LIST \u0432\u044B\u0434\u0430\u0435\u0442 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435.
89
+ \u0424\u0430\u0439\u043B \u0437\u043D\u0430\u0447\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0442 BS_PSF.RKR, \u043D\u043E \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0438\u044F \u043D\u0435\u043F\u043E\u043D\u044F\u0442\u043D\u044B.`,
90
+ screenshots: [
91
+ "BASICMUS.RKR-1.png",
92
+ "BASICMUS.RKR-2.png",
93
+ "BASICMUS.RKR-3.png",
94
+ "BASICMUS.RKR-4.png"
95
+ ]
96
+ },
97
+ {
98
+ name: "BASICPC.RKR",
99
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A BASIC *RADIO-86PC*",
100
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 "READY!".',
101
+ screenshots: [
102
+ "BASICPC.RKR-1.png"
103
+ ]
104
+ },
105
+ {
106
+ name: "BASICSER.RKR",
107
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A *\u0420\u0410\u0414\u0418\u041E-86\u0420\u041A* BASIC",
108
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 "OK". \u0424\u0430\u0439\u043B \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0442 BASIC80.RKR.',
109
+ screenshots: [
110
+ "BASICSER.RKR-1.png"
111
+ ]
112
+ },
113
+ {
114
+ name: "BASIC_OK.PKI",
115
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A BASIC",
116
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 "OK :". \u0413\u043B\u044E\u0447\u0438\u0442, \u043F\u0440\u0438 \u0440\u0430\u0431\u043E\u0442\u0435 \u043C\u043E\u0436\u0435\u0442 \u0432\u044B\u0432\u043E\u0434\u0438\u0442 \u043C\u0443\u0441\u043E\u0440 \u0438 \u0432\u044B\u0432\u0430\u043B\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u0432 \u041C\u043E\u043D\u0438\u0442\u043E\u0440.',
117
+ screenshots: [
118
+ "BASIC_OK.PKI-1.png"
119
+ ]
120
+ },
121
+ {
122
+ name: "BASIC_PR.PKI",
123
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A *\u0420\u0410\u0414\u0418\u041E-86\u0420\u041A* BASIC",
124
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 "=>".',
125
+ screenshots: [
126
+ "BASIC_PR.PKI-1.png"
127
+ ]
128
+ },
129
+ {
130
+ name: "BASIC_RK.RKR",
131
+ title: '\u0411\u0435\u0439\u0441\u0438\u043A *\u0420\u0410\u0414\u0418\u041E-86\u0420\u041A* BASIC "=>"',
132
+ description: "\u0424\u0430\u0439\u043B \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0442 BASIC_PR.PKI, \u043D\u043E \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0438\u044F \u043D\u0435\u043F\u043E\u043D\u044F\u0442\u043D\u044B.",
133
+ screenshots: [
134
+ "BASIC_RK.RKR-1.png"
135
+ ]
136
+ },
137
+ {
138
+ name: "BASMIC.RKR",
139
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A *\u041C\u0418\u041A\u0420\u041E\u0428\u0410* BASIC",
140
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 "=>".',
141
+ screenshots: [
142
+ "BASMIC.RKR-1.png"
143
+ ]
144
+ },
145
+ {
146
+ name: "BAS_MICR.PKI",
147
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A BASIC *\u041C\u0418\u041A\u0420\u041E\u041D*",
148
+ description: '\u0417\u0430\u043F\u0440\u043E\u0441 "NEW?", \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 "\u0416\u0414\u0423:".',
149
+ screenshots: [
150
+ "BAS_MICR.PKI-1.png"
151
+ ]
152
+ },
153
+ {
154
+ name: "BOMBER.GAM",
155
+ title: "\u0418\u0433\u0440\u0430 \u0411\u043E\u043C\u0431\u0430\u0440\u0434\u0438\u0440\u043E\u0432\u0449\u0438\u043A",
156
+ description: "",
157
+ screenshots: [
158
+ "BOMBER.GAM-1.png",
159
+ "BOMBER.GAM-2.png"
160
+ ]
161
+ },
162
+ {
163
+ name: "BS_M_OLD.RKR",
164
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A BASIC *\u041C\u0418\u041A\u0420\u041E\u041D*",
165
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 "\u0416\u0414\u0423:". \u0424\u0430\u0439\u043B \u0441\u0438\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0442 BAS_MICR.PKI.',
166
+ screenshots: [
167
+ "BS_M_OLD.RKR-1.png"
168
+ ]
169
+ },
170
+ {
171
+ name: "BS_PSF.RKR",
172
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A PSF BASIC 32K V3.2",
173
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0410\u043D\u0430\u0448\u043A\u0438\u043D \u0410.\u0410., 24 \u0444\u0435\u0432\u0440\u0430\u043B\u044F 1987. \u0424\u0430\u0439\u043B \u0437\u043D\u0430\u0447\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0442 BASICMUS.RKR, \u043D\u043E \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0438\u044F \u043D\u0435\u043F\u043E\u043D\u044F\u0442\u043D\u044B. \u0414\u0430\u043D\u043D\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F \u043D\u0435 \u0438\u043C\u0435\u0435\u0442 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F \u043F\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0435 LIST \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u0441\u0442\u0430\u0440\u0442\u0430.",
174
+ screenshots: [
175
+ "BS_PSF.RKR-1.png"
176
+ ]
177
+ },
178
+ {
179
+ name: "BS_SVVI.RKR",
180
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A *SVVI-76/79* BASIC",
181
+ description: "",
182
+ screenshots: [
183
+ "BS_SVVI.RKR-1.png"
184
+ ]
185
+ },
186
+ {
187
+ name: "BULNIK.GAM",
188
+ title: "\u0418\u0433\u0440\u0430 \u0411\u0443\u043B\u044C\u043D\u0438\u043A",
189
+ description: "\u0421\u0442\u0440\u0430\u043D\u043D\u0430\u044F, \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0434\u0435\u043B\u0430\u044E\u0449\u0430\u044F \u0438\u0433\u0440\u0430.",
190
+ screenshots: [
191
+ "BULNIK.GAM-1.png"
192
+ ]
193
+ },
194
+ {
195
+ name: "C.PKI",
196
+ title: "\u042F\u0437\u044B\u043A C, Saratov Best-C Compiler",
197
+ description: "\u0421\u0413\u0423, \u0424\u0438\u0437\u0438\u043A\u0430-1989, \u041A\u043E\u0432\u0430\u043B\u0435\u043D\u043A\u043E \u0414.\u0418.",
198
+ screenshots: [
199
+ "C.PKI-1.png"
200
+ ]
201
+ },
202
+ {
203
+ name: "CHERV.RKR",
204
+ title: "\u0418\u0433\u0440\u0430 \u0427\u0435\u0440\u0432\u044F\u043A",
205
+ description: "\u041C\u042D\u0418, \u041A\u0430\u0444\u0435\u0434\u0440\u0430 \u0420\u0422\u041F, 1987",
206
+ screenshots: [
207
+ "CHERV.RKR-1.png",
208
+ "CHERV.RKR-2.png"
209
+ ]
210
+ },
211
+ {
212
+ name: "CHESS.GAM",
213
+ title: "\u0418\u0433\u0440\u0430 \u0428\u0430\u0445\u043C\u0430\u0442\u044B",
214
+ description: "\u0420\u0438\u0433\u0430, 1987",
215
+ screenshots: [
216
+ "CHESS.GAM-1.png",
217
+ "CHESS.GAM-2.png"
218
+ ]
219
+ },
220
+ {
221
+ name: "CHESS2.RKR",
222
+ title: "\u0418\u0433\u0440\u0430 \u0428\u0430\u0445\u043C\u0430\u0442\u044B",
223
+ description: "Handikraft",
224
+ screenshots: [
225
+ "CHESS2.RKR-1.png"
226
+ ]
227
+ },
228
+ {
229
+ name: "CHESS_X.GAM",
230
+ title: "\u0418\u0433\u0440\u0430 \u0428\u0430\u0445\u043C\u0430\u0442\u044B",
231
+ description: "\u0420\u0438\u0433\u0430, 1987",
232
+ screenshots: [
233
+ "CHESS_X.GAM-1.png",
234
+ "CHESS_X.GAM-2.png"
235
+ ]
236
+ },
237
+ {
238
+ name: "CHUDOV.RK",
239
+ title: "\u0418\u0433\u0440\u0430 \u0427\u0443\u0434\u043E\u0432\u0438\u0449\u0435",
240
+ description: "",
241
+ screenshots: [
242
+ "CHUDOV.RK-1.png"
243
+ ]
244
+ },
245
+ {
246
+ name: "CIRCUS.RKR",
247
+ title: "\u0418\u0433\u0440\u0430 \u0426\u0438\u0440\u043A",
248
+ description: "\u0410\u0432\u0442\u043E\u0440: \u041F\u043E\u043F\u043E\u0432 \u0421.\u041D., 1986",
249
+ screenshots: [
250
+ "CIRCUS.RKR-1.png",
251
+ "CIRCUS.RKR-2.png"
252
+ ]
253
+ },
254
+ {
255
+ name: "CIRK.GAM",
256
+ title: "\u0418\u0433\u0440\u0430 \u0426\u0438\u0440\u043A",
257
+ description: "\u0410\u0432\u0442\u043E\u0440: \u041F\u043E\u043F\u043E\u0432 \u0421.\u041D., 1986",
258
+ screenshots: [
259
+ "CIRK.GAM-1.png",
260
+ "CIRK.GAM-2.png"
261
+ ]
262
+ },
263
+ {
264
+ name: "CONSTMAG.RKR",
265
+ title: "\u0427\u0442\u043E-\u0442\u043E \u0434\u043B\u044F \u043C\u0430\u0433\u043D\u0438\u0442\u043E\u0444\u043E\u043D\u043D\u043E\u0439 \u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u044B",
266
+ description: "\u041D\u0435\u043F\u043E\u043D\u044F\u0442\u043D\u043E, \u0447\u0442\u043E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u0434\u0435\u043B\u0430\u0435\u0442.",
267
+ screenshots: []
268
+ },
269
+ {
270
+ name: "CPM.RKR",
271
+ title: "\u0427\u0442\u043E-\u0442\u043E, \u043D\u043E \u043D\u0435 OS CP/M",
272
+ description: "",
273
+ screenshots: [
274
+ "CPM.RKR-1.png"
275
+ ]
276
+ },
277
+ {
278
+ name: "DEBUG.PKI",
279
+ title: "\u041E\u0442\u043B\u0430\u0434\u0447\u0438\u043A DP*STF* V2.0",
280
+ description: "\u0424\u0430\u0439\u043B \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0431\u0430\u0439\u0442 \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0442 DEBUG.RK.",
281
+ screenshots: [
282
+ "DEBUG.PKI-1.png",
283
+ "DEBUG.PKI-2.png"
284
+ ]
285
+ },
286
+ {
287
+ name: "DEBUG.RK",
288
+ title: "\u041E\u0442\u043B\u0430\u0434\u0447\u0438\u043A DP*STF* V2.0",
289
+ description: "\u0424\u0430\u0439\u043B \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0431\u0430\u0439\u0442 \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0442 DEBUG.PKI.",
290
+ screenshots: [
291
+ "DEBUG.RK-1.png",
292
+ "DEBUG.RK-2.png"
293
+ ]
294
+ },
295
+ {
296
+ name: "DESCENT.RK",
297
+ title: "\u0418\u0433\u0440\u0430 Descent",
298
+ description: "\u041F\u043E\u0433\u043E\u0434\u0438\u043D \u0414.\u0412., 1989.",
299
+ screenshots: [
300
+ "DESCENT.RK-1.png",
301
+ "DESCENT.RK-2.png"
302
+ ]
303
+ },
304
+ {
305
+ name: "DISASM.RK",
306
+ title: "\u0414\u0438\u0437\u0430\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440 \u041C\u0418\u041A\u0420\u041E\u041D",
307
+ description: "",
308
+ screenshots: [
309
+ "DISASM.RK-1.png"
310
+ ]
311
+ },
312
+ {
313
+ name: "DISMIC.PKI",
314
+ title: "\u0414\u0438\u0437\u0430\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440 \u0438 \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u041C\u0418\u041A\u0420\u041E\u041D",
315
+ description: "",
316
+ screenshots: [
317
+ "DISMIC.PKI-1.png"
318
+ ]
319
+ },
320
+ {
321
+ name: "DIVERSE.GAM",
322
+ title: "\u0418\u0433\u0440\u0430 \u0414\u0438\u0432\u0435\u0440\u0441\u0430\u043D\u0442",
323
+ description: "\u0425\u0430\u0440\u044C\u043A\u043E\u0432, 1989.",
324
+ screenshots: [
325
+ "DIVERSE.GAM-1.png",
326
+ "DIVERSE.GAM-2.png"
327
+ ]
328
+ },
329
+ {
330
+ name: "DSSM-CPM.RKR",
331
+ title: "\u0414\u0438\u0437\u0430\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440 \u043E\u0442 Ward Christersen",
332
+ description: "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C, \u043C\u043E\u0436\u0435\u0442 \u043D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0430\u0434\u0440\u0435\u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438.",
333
+ screenshots: []
334
+ },
335
+ {
336
+ name: "DUMPCOR1.RK",
337
+ title: "\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043F\u0430\u043C\u044F\u0442\u0438",
338
+ description: "",
339
+ screenshots: [
340
+ "DUMPCOR1.RK-1.png"
341
+ ]
342
+ },
343
+ {
344
+ name: "DUMPCOR2.RK",
345
+ title: "\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043F\u0430\u043C\u044F\u0442\u0438 HED",
346
+ description: "",
347
+ screenshots: [
348
+ "DUMPCOR2.RK-1.png"
349
+ ]
350
+ },
351
+ {
352
+ name: "DUMPED.PKI",
353
+ title: '\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043F\u0430\u043C\u044F\u0442\u0438 <a href="https://github.com/begoon/rk86-maximite/blob/master/programs/dumped/dumped.asm">Dump Editor</a>',
354
+ description: "\u0410\u0432\u0442\u043E\u0440: \u0414\u0435\u043C\u0438\u043D \u0410\u043B\u0435\u043A\u0441\u0430\u043D\u0434\u0440.",
355
+ screenshots: [
356
+ "DUMPED.PKI-1.png"
357
+ ]
358
+ },
359
+ {
360
+ name: "ED-DSSM.RKR",
361
+ title: "\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0438 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440 \u041C\u0438\u043A\u0440\u043E\u043D",
362
+ description: "",
363
+ screenshots: [
364
+ "ED-DSSM.RKR-1.png"
365
+ ]
366
+ },
367
+ {
368
+ name: "ED-DSSM2.RKR",
369
+ title: "\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0438 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440 \u041C\u0438\u043A\u0440\u043E\u043D",
370
+ description: "\u041E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043D\u0430 \u043F\u0430\u0440\u0443 \u0431\u0430\u0439\u0442 \u043E\u0442 ED-DSSM.RKR, \u043D\u043E \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0438\u044F \u043D\u0435\u043F\u043E\u043D\u044F\u0442\u043D\u044B.",
371
+ screenshots: [
372
+ "ED-DSSM2.RKR-1.png"
373
+ ]
374
+ },
375
+ {
376
+ name: "EDITSORT.PKI",
377
+ title: "\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 *SORT UT* V1.1",
378
+ description: "",
379
+ screenshots: [
380
+ "EDITSORT.PKI-1.png"
381
+ ]
382
+ },
383
+ {
384
+ name: "EDMASM.PKI",
385
+ title: "\u0410\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440 \u0438 \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u041C\u0418\u041A\u0420\u041E\u041D",
386
+ description: "",
387
+ screenshots: [
388
+ "EDMASM.PKI-1.png",
389
+ "EDMASM.PKI-2.png"
390
+ ]
391
+ },
392
+ {
393
+ name: "E_STAKAN.RKR",
394
+ title: "\u0418\u0433\u0440\u0430 \u0421\u0442\u0430\u043A\u0430\u043D",
395
+ description: "",
396
+ screenshots: [
397
+ "E_STAKAN.RKR-1.png"
398
+ ]
399
+ },
400
+ {
401
+ name: "FORMULA.RK",
402
+ title: "\u0418\u0433\u0440\u0430 \u0424\u043E\u0440\u043C\u0443\u043B\u0430",
403
+ description: "\u0410\u0432\u0442\u043E\u0440 \u041A\u043E\u043B\u043E\u0441\u043E\u0432 \u041A., 1991",
404
+ screenshots: [
405
+ "FORMULA.RK-1.png",
406
+ "FORMULA.RK-2.png"
407
+ ]
408
+ },
409
+ {
410
+ name: "FORTH.PKI",
411
+ title: "\u042F\u0437\u044B\u043A \u0424\u043E\u0440\u0442. \u0424\u043E\u0440\u0442-\u0421\u0438\u0441\u0442\u0435\u043C\u0430 \u041B\u0421-1",
412
+ description: "\u041D\u0418\u0418\u0421\u0427\u0415\u0422\u041C\u0410\u0428 \u041B\u0413\u0423, \u041B\u0435\u0439\u0434\u0438-\u0421\u043E\u0444\u0442, 1986.",
413
+ screenshots: [
414
+ "FORTH.PKI-1.png",
415
+ "FORTH.PKI-2.png"
416
+ ]
417
+ },
418
+ {
419
+ name: "FOXHUNT.RK",
420
+ title: "\u0418\u0433\u0440\u0430 \u041E\u0445\u043E\u0442\u0430 \u043D\u0430 \u043B\u0438\u0441",
421
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0411\u0435\u043B\u043E\u0432.",
422
+ screenshots: [
423
+ "FOXHUNT.RK-1.png",
424
+ "FOXHUNT.RK-2.png"
425
+ ]
426
+ },
427
+ {
428
+ name: "FULLEDIT.PKI",
429
+ title: "\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u041C\u0418\u041A\u0420\u041E\u041D",
430
+ description: "",
431
+ screenshots: [
432
+ "FULLEDIT.PKI-1.png"
433
+ ]
434
+ },
435
+ {
436
+ name: "GFIRE.GAM",
437
+ title: "Crossfire, \u0412\u0435\u0440\u0441\u0438\u044F 002 (\u041C\u0438\u043A\u0440\u043E\u0448\u0430)",
438
+ description: "\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A: \u0417\u044B\u0440\u044F\u043D\u043E\u0432 \u0410.\u0412., 1988.",
439
+ screenshots: [
440
+ "GFIRE.GAM-1.png",
441
+ "GFIRE.GAM-2.png"
442
+ ]
443
+ },
444
+ {
445
+ name: "GLASS1.GAM",
446
+ title: "\u0418\u0433\u0440\u0430 \u0421\u0442\u0430\u043A\u0430\u043D, \u0432\u0435\u0440\u0441\u0438\u044F 3.1",
447
+ description: "ALG, \u041A\u043E\u043B\u043E\u043C\u043D\u0430 \u0418\u043D\u0442\u0435\u0433\u0440\u0430\u043B, 1988",
448
+ screenshots: [
449
+ "GLASS1.GAM-1.png"
450
+ ]
451
+ },
452
+ {
453
+ name: "GLASS2.GAM",
454
+ title: "\u0418\u0433\u0440\u0430 \u0421\u0442\u0430\u043A\u0430\u043D",
455
+ description: "",
456
+ screenshots: [
457
+ "GLASS2.GAM-1.png",
458
+ "GLASS2.GAM-2.png"
459
+ ]
460
+ },
461
+ {
462
+ name: "HEXEDIT1.RKR",
463
+ title: "\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043F\u0430\u043C\u044F\u0442\u0438, \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430\u0442\u043E\u0440 \u041F\u0417\u0423 \u0438 \u041F\u041F\u0417\u0423",
464
+ description: "",
465
+ screenshots: [
466
+ "HEXEDIT1.RKR-1.png",
467
+ "HEXEDIT1.RKR-2.png"
468
+ ]
469
+ },
470
+ {
471
+ name: "HEXEDIT2.RKR",
472
+ title: "\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043F\u0430\u043C\u044F\u0442\u0438, \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430\u0442\u043E\u0440 \u041F\u0417\u0423 \u0438 \u041F\u041F\u0417\u0423",
473
+ description: "",
474
+ screenshots: [
475
+ "HEXEDIT2.RKR-1.png",
476
+ "HEXEDIT2.RKR-2.png"
477
+ ]
478
+ },
479
+ {
480
+ name: "I8080TST.GAM",
481
+ title: "\u0422\u0435\u0441\u0442 MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC V1.0, 1980",
482
+ description: "\u0410\u0434\u0430\u043F\u0442\u0438\u0440\u043E\u0432\u0430\u043D \u0434\u043B\u044F \u0432\u044B\u0432\u043E\u0434\u0430 \u043D\u0430 \u044D\u043A\u0440\u0430\u043D \u0447\u0435\u0440\u0435\u0437 \u043F\u043E\u0434\u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B \u0420\u041A.",
483
+ screenshots: [
484
+ "I8080TST.GAM-1.png"
485
+ ]
486
+ },
487
+ {
488
+ name: "JUMP.RK",
489
+ title: "\u0418\u0433\u0440\u0430 Jump",
490
+ description: "LLE. \u042D\u0442\u0443 \u0438\u0433\u0440\u0443 \u043D\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0441\u044F \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043F\u043E\u0441\u043B\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0435\u0435 \u043D\u0430\u0434\u043E \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u0434\u043D\u043E\u0439 G0.",
491
+ screenshots: [
492
+ "JUMP.RK-1.png",
493
+ "JUMP.RK-2.png",
494
+ "JUMP.RK-3.png"
495
+ ]
496
+ },
497
+ {
498
+ name: "KAKVAS.GAM",
499
+ title: "\u041A\u0430\u043A \u0412\u0430\u0441 \u0437\u043E\u0432\u0443\u0442?",
500
+ description: "\u041F\u0440\u0438\u043C\u0438\u0442\u0438\u0432\u043D\u0430\u044F \u0434\u0435\u043C\u043E-\u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430.",
501
+ screenshots: [
502
+ "KAKVAS.GAM-1.png"
503
+ ]
504
+ },
505
+ {
506
+ name: "KALAH.RKR",
507
+ title: "\u0418\u0433\u0440\u0430 \u041A\u0430\u043B\u0430\u0445",
508
+ description: "Handikraft",
509
+ screenshots: [
510
+ "KALAH.RKR-1.png"
511
+ ]
512
+ },
513
+ {
514
+ name: "KLAD.RK",
515
+ title: "\u0418\u0433\u0440\u0430 \u041A\u043B\u0430\u0434, \u0432\u0435\u0440\u0441\u0438\u044F 1.4",
516
+ description: "\u0410\u0432\u0442\u043E\u0440 \u041F\u0443\u0439\u0441\u0438\u0441-\u041F\u0443\u0439\u0448\u0435 \u042D.\u0418., \u0420\u0438\u0433\u0430, 1987. \u0424\u0430\u0439\u043B \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0434\u0438\u043D \u0431\u0430\u0439\u0442\u043E\u043C \u043E\u0442 KLAD.RKR.",
517
+ screenshots: [
518
+ "KLAD.RK-1.png",
519
+ "KLAD.RK-2.png"
520
+ ]
521
+ },
522
+ {
523
+ name: "KLAD.RKR",
524
+ title: "\u0418\u0433\u0440\u0430 \u041A\u043B\u0430\u0434, \u0432\u0435\u0440\u0441\u0438\u044F 1.4",
525
+ description: "\u0410\u0432\u0442\u043E\u0440 \u041F\u0443\u0439\u0441\u0438\u0441-\u041F\u0443\u0439\u0448\u0435 \u042D.\u0418., \u0420\u0438\u0433\u0430, 1987. \u0424\u0430\u0439\u043B \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0434\u043D\u0438\u043C \u0431\u0430\u0439\u0442\u043E\u043C \u043E\u0442 KLAD.RK.",
526
+ screenshots: [
527
+ "KLAD.RKR-1.png",
528
+ "KLAD.RKR-2.png"
529
+ ]
530
+ },
531
+ {
532
+ name: "KRESTNO.GAM",
533
+ title: "\u0418\u0433\u0440\u0430 \u041A\u0440\u0435\u0441\u0442\u0438\u043A\u0438-\u041D\u043E\u043B\u0438\u043A\u0438 5 \u0432 \u0440\u044F\u0434",
534
+ description: "",
535
+ screenshots: [
536
+ "KRESTNO.GAM-1.png",
537
+ "KRESTNO.GAM-2.png"
538
+ ]
539
+ },
540
+ {
541
+ name: "KROK.GAM",
542
+ title: "\u0418\u0433\u0440\u0430 \u041A\u0440\u043E\u043A, \u0432\u0435\u0440\u0441\u0438\u044F 1.1",
543
+ description: "\u0410\u0432\u0442\u043E\u0440\u044B \u0410\u043B\u0435\u043A\u0441\u0430\u043D\u0434\u0440\u043E\u0432 \u041C. \u0438 \u041C\u043E\u0442\u043E\u0432\u0438\u043B\u043E\u0432 \u0421. \u041C\u0418\u0413, \u041F\u0435\u0440\u043C\u044C, 1988.",
544
+ screenshots: [
545
+ "KROK.GAM-1.png",
546
+ "KROK.GAM-2.png"
547
+ ]
548
+ },
549
+ {
550
+ name: "LABYRINT.GAM",
551
+ title: "\u0418\u0433\u0440\u0430 \u041F\u043E\u0433\u043E\u043D\u044F \u0432 \u041B\u0430\u0431\u0438\u0440\u0438\u043D\u0442\u0435",
552
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0412\u043E\u0437\u043D\u044B\u0439 \u0414.\u0412., \u041A\u0430\u043F\u0443\u0441\u0442\u0438\u043D \u042F\u0440, 1989.",
553
+ screenshots: [
554
+ "LABYRINT.GAM-1.png",
555
+ "LABYRINT.GAM-2.png"
556
+ ]
557
+ },
558
+ {
559
+ name: "LEST.GAM",
560
+ title: "\u0418\u0433\u0440\u0430 \u041B\u0435\u0441\u0442\u043D\u0438\u0446\u0430",
561
+ description: "",
562
+ screenshots: [
563
+ "LEST.GAM-1.png",
564
+ "LEST.GAM-2.png"
565
+ ]
566
+ },
567
+ {
568
+ name: "LESTN.RK",
569
+ title: "\u0418\u0433\u0440\u0430 \u041B\u0435\u0441\u0442\u043D\u0438\u0446\u0430-1",
570
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0421\u0438\u043C\u043E\u043D\u043E\u0432 \u042E.\u0411.",
571
+ screenshots: [
572
+ "LESTN.RK-1.png",
573
+ "LESTN.RK-2.png"
574
+ ]
575
+ },
576
+ {
577
+ name: "LESTN1.GAM",
578
+ title: "\u0418\u0433\u0440\u0430 \u041B\u0435\u0441\u0442\u043D\u0438\u0446\u0430-1",
579
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0421\u0438\u043C\u043E\u043D\u043E\u0432 \u042E.\u0411.",
580
+ screenshots: [
581
+ "LESTN1.GAM-1.png",
582
+ "LESTN1.GAM-2.png"
583
+ ]
584
+ },
585
+ {
586
+ name: "LESTNICA.GAM",
587
+ title: "\u0418\u0433\u0440\u0430 \u041B\u0435\u0441\u0442\u043D\u0438\u0446\u0430-1",
588
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0421\u0438\u043C\u043E\u043D\u043E\u0432 \u042E.\u0411.",
589
+ screenshots: [
590
+ "LESTNICA.GAM-1.png",
591
+ "LESTNICA.GAM-2.png"
592
+ ]
593
+ },
594
+ {
595
+ name: "LIFE.RKR",
596
+ title: "\u0418\u0433\u0440\u0430 \u0416\u0438\u0437\u043D\u044C",
597
+ description: "*VCP*",
598
+ screenshots: [
599
+ "LIFE.RKR-1.png",
600
+ "LIFE.RKR-2.png"
601
+ ]
602
+ },
603
+ {
604
+ name: "LINKRK.RKR",
605
+ title: "\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u0441\u0432\u044F\u0437\u0438 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u043E\u0432 \u0447\u0435\u0440\u0435\u0437 \u041F\u041F\u0410-\u0412\u041055\u0410",
606
+ description: "",
607
+ screenshots: [
608
+ "LINKRK.RKR-1.png"
609
+ ]
610
+ },
611
+ {
612
+ name: "LOMAZE.RK",
613
+ title: "\u0418\u0433\u0440\u0430 Maze, \u0432\u0435\u0440\u0441\u0438\u044F 1.05",
614
+ description: "SC80, \u041C\u043E\u0441\u043A\u0432\u0430, \u0424\u041C\u0428-542, 03.01.88. \u0418\u0433\u0440\u0430 \u0433\u043B\u044E\u0447\u0438\u0442, \u043B\u0443\u0447\u0448\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C MAZE.GAM.",
615
+ screenshots: [
616
+ "LOMAZE.RK-1.png",
617
+ "LOMAZE.RK-2.png"
618
+ ]
619
+ },
620
+ {
621
+ name: "LORUNNER.GAM",
622
+ title: "\u0418\u0433\u0440\u0430 Lode runner",
623
+ description: "*BSV* CORP., MOSCOW 4/1990.",
624
+ screenshots: [
625
+ "LORUNNER.GAM-1.png",
626
+ "LORUNNER.GAM-2.png",
627
+ "LORUNNER.GAM-3.png"
628
+ ]
629
+ },
630
+ {
631
+ name: "MAZE.GAM",
632
+ title: "\u0418\u0433\u0440\u0430 Maze, \u0432\u0435\u0440\u0441\u0438\u044F 1.05",
633
+ description: "SC80, \u041C\u043E\u0441\u043A\u0432\u0430, \u0424\u041C\u0428-542, 03.01.88",
634
+ screenshots: [
635
+ "MAZE.GAM-1.png",
636
+ "MAZE.GAM-2.png"
637
+ ]
638
+ },
639
+ {
640
+ name: "MICRON_R.PKI",
641
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A BASIC *\u041C\u0418\u041A\u0420\u041E\u041D*",
642
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 "\u0416\u0414\u0423". \u0413\u043B\u044E\u0447\u0438\u0442, \u043F\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0432\u044B\u0432\u043E\u0434\u0438\u0442 \u043C\u0443\u0441\u043E\u0440 \u0438 \u0432\u0438\u0441\u043D\u0435\u0442.',
643
+ screenshots: [
644
+ "MICRON_R.PKI-1.png"
645
+ ]
646
+ },
647
+ {
648
+ name: "MICR_PRT.PKI",
649
+ title: "\u0411\u0435\u0439\u0441\u0438\u043A BASIC *\u041C\u0418\u041A\u0420\u041E\u041D*",
650
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0436\u0435\u043D\u0438\u0435 "\u0416\u0414\u0423:". \u041F\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0437\u0430\u0434\u0430\u0435\u0442 \u0432\u043E\u043F\u0440\u043E\u0441 \u043E \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0438 \u043F\u0435\u0447\u0430\u0442\u0438.',
651
+ screenshots: [
652
+ "MICR_PRT.PKI-1.png"
653
+ ]
654
+ },
655
+ {
656
+ name: "MORSE16.RKR",
657
+ title: "\u0427\u0442\u043E-\u0442\u043E \u043A\u0430\u043A-\u0442\u043E \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0449\u0435\u0435 \u0434\u043B\u044F \u0430\u0437\u0431\u0443\u043A\u0438 \u041C\u043E\u0440\u0437\u0435 (UT5DE/UA3 CW RX)",
658
+ description: "",
659
+ screenshots: [
660
+ "MORSE16.RKR-1.png"
661
+ ]
662
+ },
663
+ {
664
+ name: "MUSIC.RKR",
665
+ title: "\u041C\u0443\u0437\u044B\u043A\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u041C\u0421 3.2",
666
+ description: "\u041E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043D\u0430 \u043F\u0430\u0440\u0443 \u0431\u0430\u0439\u0442 \u043E\u0442 PMS.PKI, \u043D\u043E \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0438\u044F \u043D\u0435\u043F\u043E\u043D\u044F\u0442\u043D\u044B.",
667
+ screenshots: [
668
+ "MUSIC.RKR-1.png"
669
+ ]
670
+ },
671
+ {
672
+ name: "MUZUKRED.RKR",
673
+ title: "\u041C\u0443\u0437\u044B\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0412\u0438\u0440\u0442\u0443\u043E\u0437",
674
+ description: "",
675
+ screenshots: [
676
+ "MUZUKRED.RKR-1.png"
677
+ ]
678
+ },
679
+ {
680
+ name: "MUZ_SYST.RKR",
681
+ title: "\u041C\u0443\u0437\u044B\u043A\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u041C\u0421 3.2",
682
+ description: "\u041E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043C\u043D\u043E\u0433\u0438\u043C\u0438 \u0431\u0430\u0439\u0442\u0430\u043C\u0438 \u043E\u0442 PMS.PKI \u0438 MUSIC.RKR, \u043D\u043E \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0438\u044F \u043D\u0435\u043F\u043E\u043D\u044F\u0442\u043D\u044B.",
683
+ screenshots: [
684
+ "MUZ_SYST.RKR-1.png"
685
+ ]
686
+ },
687
+ {
688
+ name: "NALET.RK",
689
+ title: "\u0418\u0433\u0440\u0430 \u041D\u0430\u043B\u0435\u0442",
690
+ description: `TPT 1994. \u0420\u0435\u0430\u043B\u044C\u043D\u043E \u0438\u0433\u0440\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442, \u043D\u0435 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044F \u043D\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435
691
+ \u0441\u0442\u0440\u0435\u043B\u043A\u0430\u043C\u0438. \u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E, \u043E\u043D\u0430 \u043E\u0442 \u0434\u0440\u0443\u0433\u043E\u0433\u043E \u043A\u043B\u043E\u043D\u0430 \u0420\u041A.`,
692
+ screenshots: [
693
+ "NALET.RK-1.png",
694
+ "NALET.RK-2.png",
695
+ "NALET.RK-3.png"
696
+ ]
697
+ },
698
+ {
699
+ name: "O1.GAM",
700
+ title: "\u0418\u0433\u0440\u0430 \u0423\u0434\u0430\u0432, \u041C\u0430\u0440\u0441\u0438\u0430\u043D\u0435, \u0421\u0442\u0430\u043A\u0430\u043D, \u041D\u043E\u0447\u043D\u043E\u0439 \u043F\u0430\u0440\u043A",
701
+ description: "\u0410\u0432\u0442\u043E\u0440\u044B \u0417\u043E\u043D\u043E\u0432 \u0418.\u041F., \u0421\u043E\u043A\u043E\u043B\u0438\u043D \u041F.\u041D. \u0418\u0433\u0440\u0430 \u041D\u043E\u0447\u043D\u043E\u0439 \u043F\u0430\u0440\u043A \u043D\u0430 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442, 1987.",
702
+ screenshots: [
703
+ "O1.GAM-1.png",
704
+ "O1.GAM-2.png",
705
+ "O1.GAM-3.png",
706
+ "O1.GAM-4.png",
707
+ "O1.GAM-5.png",
708
+ "O1.GAM-6.png",
709
+ "O1.GAM-7.png"
710
+ ]
711
+ },
712
+ {
713
+ name: "OTELLO.RKR",
714
+ title: "\u0418\u0433\u0440\u0430 \u041E\u0442\u0435\u043B\u043B\u043E",
715
+ description: "\u0410\u0432\u0442\u043E\u0440 \u041A\u043E\u043D\u043E\u043D\u043E\u0432 \u042E.\u041E., 1987.",
716
+ screenshots: [
717
+ "OTELLO.RKR-1.png",
718
+ "OTELLO.RKR-2.png"
719
+ ]
720
+ },
721
+ {
722
+ name: "OilsWell.rkr",
723
+ title: "\u0418\u0433\u0440\u0430 OilsWell",
724
+ description: "OilsWell / \u0410\u0432\u0442\u043E\u0440 \u0427\u0443\u0433\u0443\u043D\u043E\u0432 \u0412.",
725
+ screenshots: [
726
+ "OilsWell.rkr-1.png",
727
+ "OilsWell.rkr-2.png",
728
+ "OilsWell.rkr-3.png"
729
+ ]
730
+ },
731
+ {
732
+ name: "PACMAN.GAM",
733
+ title: "\u0418\u0433\u0440\u0430 Pacman",
734
+ description: "Pacman-87.",
735
+ screenshots: [
736
+ "PACMAN.GAM-1.png"
737
+ ]
738
+ },
739
+ {
740
+ name: "PACMAN.RK",
741
+ title: "\u0418\u0433\u0440\u0430 Pacman",
742
+ description: "",
743
+ screenshots: [
744
+ "PACMAN.RK-1.png"
745
+ ]
746
+ },
747
+ {
748
+ name: "PACMAN1.GAM",
749
+ title: "\u0418\u0433\u0440\u0430 Pacman",
750
+ description: "",
751
+ screenshots: [
752
+ "PACMAN1.GAM-1.png"
753
+ ]
754
+ },
755
+ {
756
+ name: "PAKET.GAM",
757
+ title: "\u0418\u0433\u0440\u0430 \u0422\u0435\u0442\u0440\u0438\u0441, \u0411\u043E\u043B\u043E\u0442\u043E, Pacman, \u041F\u0438\u0442\u043E\u043D, \u0420\u0430\u043B\u043B\u0438, \u0421\u043B\u0430\u043B\u043E\u043C",
758
+ description: "\u0422\u0435\u0442\u0440\u0438\u0441 / \u0412\u0435\u0440\u0441\u0438\u044F 2.0, \u0420\u0430\u043B\u043B\u0438 / \u0410\u0432\u0442\u043E\u0440 \u0420\u043E\u0449\u0438\u043D \u0410.\u0410.",
759
+ screenshots: [
760
+ "PAKET.GAM-01.png",
761
+ "PAKET.GAM-02.png",
762
+ "PAKET.GAM-03.png",
763
+ "PAKET.GAM-04.png",
764
+ "PAKET.GAM-05.png",
765
+ "PAKET.GAM-06.png",
766
+ "PAKET.GAM-07.png",
767
+ "PAKET.GAM-08.png",
768
+ "PAKET.GAM-09.png",
769
+ "PAKET.GAM-10.png",
770
+ "PAKET.GAM-11.png"
771
+ ]
772
+ },
773
+ {
774
+ name: "PASCAL.PKI",
775
+ title: "\u042F\u0437\u044B\u043A PASCAL-\u041C\u0424\u0422\u0418, V01 (\u041C\u0418\u041A\u0420\u041E\u0428\u0410)",
776
+ description: "",
777
+ screenshots: [
778
+ "PASCAL.PKI-1.png"
779
+ ]
780
+ },
781
+ {
782
+ name: "PENTIS.RK",
783
+ title: "\u0418\u0433\u0440\u0430 Pentis, \u0432\u0435\u0440\u0441\u0438\u044F 1.0",
784
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0417\u0430\u0445\u0430\u0440\u043E\u0432 \u0414.\u0410., \u041C\u043E\u0441\u043A\u0432\u0430.",
785
+ screenshots: [
786
+ "PENTIS.RK-1.png",
787
+ "PENTIS.RK-2.png"
788
+ ]
789
+ },
790
+ {
791
+ name: "PINGPONG.GAM",
792
+ title: "\u0418\u0433\u0440\u0430 \u041F\u0438\u043D\u0433-\u043F\u043E\u043D\u0433",
793
+ description: "",
794
+ screenshots: [
795
+ "PINGPONG.GAM-1.png",
796
+ "PINGPONG.GAM-2.png"
797
+ ]
798
+ },
799
+ {
800
+ name: "PITON.GAM",
801
+ title: "\u0418\u0433\u0440\u0430 \u041F\u0438\u0442\u043E\u043D",
802
+ description: "",
803
+ screenshots: [
804
+ "PITON.GAM-1.png"
805
+ ]
806
+ },
807
+ {
808
+ name: "PITON.RK",
809
+ title: "\u0418\u0433\u0440\u0430 \u041F\u0438\u0442\u043E\u043D",
810
+ description: "",
811
+ screenshots: [
812
+ "PITON.RK-1.png"
813
+ ]
814
+ },
815
+ {
816
+ name: "PITON2.RK",
817
+ title: "\u0418\u0433\u0440\u0430 \u041F\u0438\u0442\u043E\u043D",
818
+ description: "",
819
+ screenshots: [
820
+ "PITON2.RK-1.png",
821
+ "PITON2.RK-2.png"
822
+ ]
823
+ },
824
+ {
825
+ name: "PITON_X.RKR",
826
+ title: "\u0418\u0433\u0440\u0430 \u041F\u0438\u0442\u043E\u043D",
827
+ description: "",
828
+ screenshots: [
829
+ "PITON_X.RKR-1.png"
830
+ ]
831
+ },
832
+ {
833
+ name: "PMS.PKI",
834
+ title: "\u041C\u0443\u0437\u044B\u043A\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u041C\u0421 3.2",
835
+ description: "",
836
+ screenshots: [
837
+ "PMS.PKI-1.png"
838
+ ]
839
+ },
840
+ {
841
+ name: "PRESS.RK",
842
+ title: "\u0418\u0433\u0440\u0430 Press",
843
+ description: "SDN, \u0420\u044F\u0437\u0430\u043D\u044C.",
844
+ screenshots: [
845
+ "PRESS.RK-1.png",
846
+ "PRESS.RK-2.png",
847
+ "PRESS.RK-3.png"
848
+ ]
849
+ },
850
+ {
851
+ name: "PROGR0.RKR",
852
+ title: "\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430\u0442\u043E\u0440 \u041F\u0417\u0423",
853
+ description: "",
854
+ screenshots: [
855
+ "PROGR0.RKR-1.png",
856
+ "PROGR0.RKR-2.png"
857
+ ]
858
+ },
859
+ {
860
+ name: "PROGR1.RKR",
861
+ title: "\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430\u0442\u043E\u0440 \u041F\u0417\u0423",
862
+ description: "\u0424\u0430\u0439\u043B \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u0435\u043D PROGR0.RKR, \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u0440\u0443\u0433\u043E\u0439 \u0441\u0442\u0430\u0440\u0442\u043E\u0432\u044B\u0439 \u0430\u0434\u0440\u0435\u0441.",
863
+ screenshots: [
864
+ "PROGR1.RKR-1.png",
865
+ "PROGR1.RKR-2.png"
866
+ ]
867
+ },
868
+ {
869
+ name: "PROGR2.RKR",
870
+ title: "\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430\u0442\u043E\u0440 \u041F\u0417\u0423",
871
+ description: "",
872
+ screenshots: [
873
+ "PROGR2.RKR-1.png"
874
+ ]
875
+ },
876
+ {
877
+ name: "PROGR3.RKR",
878
+ title: "\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430\u0442\u043E\u0440 \u041F\u0417\u0423",
879
+ description: "",
880
+ screenshots: [
881
+ "PROGR3.RKR-1.png"
882
+ ]
883
+ },
884
+ {
885
+ name: "PUSHER.GAM",
886
+ title: "\u0418\u0433\u0440\u0430 Pusher, \u0432\u0435\u0440\u0441\u0438\u044F 1.0",
887
+ description: "AYL, 18.05.91.",
888
+ screenshots: [
889
+ "PUSHER.GAM-1.png"
890
+ ]
891
+ },
892
+ {
893
+ name: "PVO.GAM",
894
+ title: "\u0418\u0433\u0440\u0430 \u041F\u0412\u041E",
895
+ description: "1987.",
896
+ screenshots: [
897
+ "PVO.GAM-1.png"
898
+ ]
899
+ },
900
+ {
901
+ name: "RAMDOS.PKI",
902
+ title: "RAMDOS V2.01, \u041F\u0443\u0441\u0442\u043E\u0439 \u0434\u0438\u0441\u043A",
903
+ description: "00.09.88",
904
+ screenshots: [
905
+ "RAMDOS.PKI-1.png",
906
+ "RAMDOS.PKI-2.png"
907
+ ]
908
+ },
909
+ {
910
+ name: "RDISK1.PKI",
911
+ title: "RAMDOS V2.01, \u0414\u0438\u0441\u043A 1",
912
+ description: "00.09.88",
913
+ screenshots: [
914
+ "RDISK1.PKI-1.png"
915
+ ]
916
+ },
917
+ {
918
+ name: "RDISK2.PKI",
919
+ title: "RAMDOS V2.01, \u0414\u0438\u0441\u043A 2",
920
+ description: "00.09.88",
921
+ screenshots: [
922
+ "RDISK2.PKI-1.png"
923
+ ]
924
+ },
925
+ {
926
+ name: "RDISK3.PKI",
927
+ title: "RAMDOS V2.01, \u0414\u0438\u0441\u043A 3",
928
+ description: "00.09.88",
929
+ screenshots: [
930
+ "RDISK3.PKI-1.png"
931
+ ]
932
+ },
933
+ {
934
+ name: "RDISK4.PKI",
935
+ title: "RAMDOS V2.01, \u0414\u0438\u0441\u043A 4",
936
+ description: "00.09.88. \u041E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0442 RDISK3.PKI \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0431\u0430\u0439\u0442.",
937
+ screenshots: [
938
+ "RDISK4.PKI-1.png"
939
+ ]
940
+ },
941
+ {
942
+ name: "RDISK6.PKI",
943
+ title: "RAMDOS V2.01, \u0414\u0438\u0441\u043A 6",
944
+ description: "00.09.88.",
945
+ screenshots: [
946
+ "RDISK6.PKI-1.png"
947
+ ]
948
+ },
949
+ {
950
+ name: "RDISK7.PKI",
951
+ title: "RAMDOS V2.01, \u0414\u0438\u0441\u043A 7",
952
+ description: "00.09.88.",
953
+ screenshots: [
954
+ "RDISK7.PKI-1.png"
955
+ ]
956
+ },
957
+ {
958
+ name: "RDISK8.PKI",
959
+ title: "RAMDOS V2.01, \u0414\u0438\u0441\u043A 8",
960
+ description: "00.09.88.",
961
+ screenshots: [
962
+ "RDISK8.PKI-1.png"
963
+ ]
964
+ },
965
+ {
966
+ name: "REDASM.PKI",
967
+ title: "\u0410\u0441\u0441\u0435\u043C\u0431\u043B\u0435\u0440 REDASSM V.2.M",
968
+ description: "",
969
+ screenshots: [
970
+ "REDASM.PKI-1.png"
971
+ ]
972
+ },
973
+ {
974
+ name: "RENDZU.RKR",
975
+ title: "\u0418\u0433\u0440\u0430 \u0420\u0435\u043D\u0434\u0437\u044E",
976
+ description: "",
977
+ screenshots: [
978
+ "RENDZU.RKR-1.png",
979
+ "RENDZU.RKR-2.png"
980
+ ]
981
+ },
982
+ {
983
+ name: "RESCUE.GAM",
984
+ title: "\u0418\u0433\u0440\u0430 Volcano, \u0432\u0435\u0440\u0441\u0438\u044F 1.0",
985
+ description: "\u0421\u041A\u0411 DESIGN, BONY, 1987.",
986
+ screenshots: [
987
+ "RESCUE.GAM-1.png",
988
+ "RESCUE.GAM-2.png"
989
+ ]
990
+ },
991
+ {
992
+ name: "REVERSI2.RKR",
993
+ title: "\u0418\u0433\u0440\u0430 \u0420\u0435\u0432\u0435\u0440\u0441\u0438",
994
+ description: "Handikraft",
995
+ screenshots: [
996
+ "REVERSI2.RKR-1.png",
997
+ "REVERSI2.RKR-2.png",
998
+ "REVERSI2.RKR-3.png"
999
+ ]
1000
+ },
1001
+ {
1002
+ name: "RIKOSHET.RK",
1003
+ title: "\u0418\u0433\u0440\u0430 \u0420\u0438\u043A\u043E\u0448\u0435\u0442, \u0432\u0435\u0440\u0441\u0438\u044F 1.4",
1004
+ description: "\u041C\u0418\u042D\u041C, 1986.",
1005
+ screenshots: [
1006
+ "RIKOSHET.RK-1.png",
1007
+ "RIKOSHET.RK-2.png"
1008
+ ]
1009
+ },
1010
+ {
1011
+ name: "ROCKER.RK",
1012
+ title: "\u0418\u0433\u0440\u0430 \u0420\u043E\u043A\u0435\u0440",
1013
+ description: "",
1014
+ screenshots: [
1015
+ "ROCKER.RK-1.png"
1016
+ ]
1017
+ },
1018
+ {
1019
+ name: "SAPPER.RK",
1020
+ title: "\u0418\u0433\u0440\u0430 \u0421\u0430\u043F\u0435\u0440",
1021
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0412\u0438\u043A\u0442\u043E\u0440 \u041F\u044B\u0445\u043E\u043D\u0438\u043D, 1995.",
1022
+ screenshots: [
1023
+ "SAPPER.RK-1.png",
1024
+ "SAPPER.RK-2.png"
1025
+ ]
1026
+ },
1027
+ {
1028
+ name: "SDEMISE.GAM",
1029
+ title: "\u0418\u0433\u0440\u0430 Spy's Demise",
1030
+ description: "\u0410\u0432\u0442\u043E\u0440\u044B \u0411\u043E\u0433\u0434\u0430\u043D\u043E\u0432 \u0421. \u0438 \u0411\u043E\u0433\u0434\u0430\u043D\u043E\u0432 \u0412., *BSV* CORP., 1990.",
1031
+ screenshots: [
1032
+ "SDEMISE.GAM-1.png",
1033
+ "SDEMISE.GAM-2.png"
1034
+ ]
1035
+ },
1036
+ {
1037
+ name: "SIRIUS.RK",
1038
+ title: "\u0418\u0433\u0440\u0430 \u0421\u0438\u0440\u0438\u0443\u0441-77-1",
1039
+ description: "\u041E\u041B\u0420\u041E \u0422\u0420. \u0418\u0433\u0440\u0430 \u0433\u043B\u044E\u0447\u0438\u0442. \u0412\u044B\u0432\u043E\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043D\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0438 \u043F\u0440\u0438 \u043F\u0440\u043E\u0439\u0433\u0440\u044B\u0448\u0435 \u0432\u044B\u0432\u0430\u043B\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u041C\u043E\u043D\u0438\u0442\u043E\u0440.",
1040
+ screenshots: [
1041
+ "SIRIUS.RK-1.png",
1042
+ "SIRIUS.RK-2.png"
1043
+ ]
1044
+ },
1045
+ {
1046
+ name: "SKACHKI.GAM",
1047
+ title: "\u0418\u0433\u0440\u0430 \u0421\u043A\u0430\u0447\u043A\u0438",
1048
+ description: "",
1049
+ screenshots: [
1050
+ "SKACHKI.GAM-1.png"
1051
+ ]
1052
+ },
1053
+ {
1054
+ name: "SKACHKI.RK",
1055
+ title: "\u0418\u0433\u0440\u0430 \u0421\u043A\u0430\u0447\u043A\u0438, \u0432\u0435\u0440\u0441\u0438\u044F 2.0",
1056
+ description: "\u0410\u0432\u0442\u043E\u0440 \u041A\u043E\u043D\u0434\u0430\u043A\u043E\u0432 \u041C., 1987.",
1057
+ screenshots: [
1058
+ "SKACHKI.RK-1.png",
1059
+ "SKACHKI.RK-2.png"
1060
+ ]
1061
+ },
1062
+ {
1063
+ name: "SKVOTCH.GAM",
1064
+ title: "\u0418\u0433\u0440\u0430 \u0421\u043A\u0432\u043E\u0448",
1065
+ description: "",
1066
+ screenshots: [
1067
+ "SKVOTCH.GAM-1.png"
1068
+ ]
1069
+ },
1070
+ {
1071
+ name: "SLAMS.GAM",
1072
+ title: "\u0418\u0433\u0440\u0430 Slams",
1073
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0417\u0430\u0445\u0430\u0440\u043E\u0432 \u0414., ZD CORP, 1990.",
1074
+ screenshots: [
1075
+ "SLAMS.GAM-1.png",
1076
+ "SLAMS.GAM-2.png",
1077
+ "SLAMS.GAM-3.png"
1078
+ ]
1079
+ },
1080
+ {
1081
+ name: "SOS1.GAM",
1082
+ title: "SOS, \u0414\u0435\u0441\u0430\u043D\u0442\u043D\u0438\u043A 1, V0.1",
1083
+ description: "\u0421\u043E\u0441\u0442\u0430\u0432\u0438\u043B: \u0417\u0430\u0445\u0430\u0440\u043E\u0432 \u0414.\u0410., 1989.",
1084
+ screenshots: [
1085
+ "SOS1.GAM-1.png",
1086
+ "SOS1.GAM-2.png"
1087
+ ]
1088
+ },
1089
+ {
1090
+ name: "SOS2.GAM",
1091
+ title: "SOS",
1092
+ description: "\u0410\u0432\u0442\u043E\u0440: \u0421\u0442\u0435\u0440\u043B\u0438\u043A\u043E\u0432 \u0421.\u0410., 1998",
1093
+ screenshots: [
1094
+ "SOS2.GAM-1.png",
1095
+ "SOS2.GAM-2.png"
1096
+ ]
1097
+ },
1098
+ {
1099
+ name: "SPITON.GAM",
1100
+ title: "\u0418\u0433\u0440\u0430 \u041F\u0438\u0442\u043E\u043D",
1101
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0410lex, Personal Computers, 1988.",
1102
+ screenshots: [
1103
+ "SPITON.GAM-1.png",
1104
+ "SPITON.GAM-2.png"
1105
+ ]
1106
+ },
1107
+ {
1108
+ name: "SPYSDEM.RK",
1109
+ title: "\u0418\u0433\u0440\u0430 Spy's Demise",
1110
+ description: "\u0410\u0432\u0442\u043E\u0440\u044B \u0411\u043E\u0433\u0434\u0430\u043D\u043E\u0432 \u0421. \u0438 \u0411\u043E\u0433\u0434\u0430\u043D\u043E\u0432 \u0412., *BSV* CORP, 1990.",
1111
+ screenshots: [
1112
+ "SPYSDEM.RK-1.png",
1113
+ "SPYSDEM.RK-2.png"
1114
+ ]
1115
+ },
1116
+ {
1117
+ name: "SP_COMP.RKR",
1118
+ title: "\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 Space Compressor",
1119
+ description: "",
1120
+ screenshots: [
1121
+ "SP_COMP.RKR-1.png"
1122
+ ]
1123
+ },
1124
+ {
1125
+ name: "SP_GAMES.RKR",
1126
+ title: "\u0418\u0433\u0440\u0430 Space Games, \u0432\u0435\u0440\u0441\u0438\u044F 2.1",
1127
+ description: "\u041B\u044C\u0432\u043E\u0432, 1987.",
1128
+ screenshots: [
1129
+ "SP_GAMES.RKR-1.png",
1130
+ "SP_GAMES.RKR-2.png",
1131
+ "SP_GAMES.RKR-3.png"
1132
+ ]
1133
+ },
1134
+ {
1135
+ name: "STELBY.RK",
1136
+ title: "\u0421\u0442\u044D\u043B\u0431\u0438",
1137
+ description: "1988.",
1138
+ screenshots: [
1139
+ "STELBY.RK-1.png",
1140
+ "STELBY.RK-2.png"
1141
+ ]
1142
+ },
1143
+ {
1144
+ name: "STONEFLD.RK",
1145
+ title: "\u0418\u0433\u0440\u0430 Stone Field",
1146
+ description: "",
1147
+ screenshots: [
1148
+ "STONEFLD.RK-1.png"
1149
+ ]
1150
+ },
1151
+ {
1152
+ name: "STOPKR.RK",
1153
+ title: "\u0418\u0433\u0440\u0430 \u0421\u0442\u043E\u043F-\u041A\u0440\u0430\u043D",
1154
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0418\u0433\u043D\u0430\u0442\u043E\u0432 \u0421., IS CORP, 1991.",
1155
+ screenshots: [
1156
+ "STOPKR.RK-1.png",
1157
+ "STOPKR.RK-2.png",
1158
+ "STOPKR.RK-3.png",
1159
+ "STOPKR.RK-4.png",
1160
+ "STOPKR.RK-5.png"
1161
+ ]
1162
+ },
1163
+ {
1164
+ name: "STRANGER.GAM",
1165
+ title: "\u0418\u0433\u0440\u0430 Strangers, \u0432\u0435\u0440\u0441\u0438\u044F 1.0",
1166
+ description: "\u0410\u0432\u0442\u043E\u0440 \u041D\u043E\u0432\u0438\u043A\u043E\u0432 \u0410., \u0421\u0430\u0440\u0430\u0442\u043E\u0432.",
1167
+ screenshots: [
1168
+ "STRANGER.GAM-1.png",
1169
+ "STRANGER.GAM-2.png"
1170
+ ]
1171
+ },
1172
+ {
1173
+ name: "SUBMARIN.RK",
1174
+ title: "\u0418\u0433\u0440\u0430 Submarine",
1175
+ description: "LLE.",
1176
+ screenshots: [
1177
+ "SUBMARIN.RK-1.png",
1178
+ "SUBMARIN.RK-2.png"
1179
+ ]
1180
+ },
1181
+ {
1182
+ name: "SVVI.RKR",
1183
+ title: "\u0418\u0433\u0440\u0430 \u041F\u0438\u0442\u043E\u043D, \u0413\u044E\u0440\u0437\u0430, \u0423\u0434\u0430\u0432, \u0427\u0435\u0440\u0432\u044F\u043A, \u041C\u0430\u0440\u0441, \u0421\u043A\u0432\u043E\u0448, \u0422\u0435\u0442\u0440\u0438\u0441",
1184
+ description: "\u0410\u0432\u0442\u043E\u0440 \u043F\u0430\u043A\u0435\u0442\u0430 \u0418\u043D\u043E\u0437\u0435\u043C\u0446\u0435\u0432 \u0412., SVVI-76/79, \u0417\u0423\u0413\u0420\u042D\u0421, 1988.",
1185
+ screenshots: [
1186
+ "SVVI.RKR-01.png",
1187
+ "SVVI.RKR-02.png",
1188
+ "SVVI.RKR-03.png",
1189
+ "SVVI.RKR-04.png",
1190
+ "SVVI.RKR-05.png",
1191
+ "SVVI.RKR-06.png",
1192
+ "SVVI.RKR-07.png",
1193
+ "SVVI.RKR-08.png",
1194
+ "SVVI.RKR-09.png",
1195
+ "SVVI.RKR-10.png",
1196
+ "SVVI.RKR-11.png",
1197
+ "SVVI.RKR-12.png",
1198
+ "SVVI.RKR-13.png",
1199
+ "SVVI.RKR-14.png",
1200
+ "SVVI.RKR-15.png"
1201
+ ]
1202
+ },
1203
+ {
1204
+ name: "TAPPER.GAM",
1205
+ title: "\u0418\u0433\u0440\u0430 \u0411\u0430\u0440\u043C\u0435\u043D, \u0432\u0435\u0440\u0441\u0438\u044F 1.5",
1206
+ description: "\u0418\u0442\u0435\u0433\u0440\u0430\u043B/\u041A\u043E\u043B\u043E\u043C\u043D\u0430, ALG, 1988.",
1207
+ screenshots: [
1208
+ "TAPPER.GAM-1.png",
1209
+ "TAPPER.GAM-2.png"
1210
+ ]
1211
+ },
1212
+ {
1213
+ name: "TENNIS.GAM",
1214
+ title: "\u0418\u0433\u0440\u0430 \u0422\u0435\u043D\u043D\u0438\u0441",
1215
+ description: "",
1216
+ screenshots: [
1217
+ "TENNIS.GAM-1.png",
1218
+ "TENNIS.GAM-2.png"
1219
+ ]
1220
+ },
1221
+ {
1222
+ name: "TENNIS.RK",
1223
+ title: "\u0418\u0433\u0440\u0430 \u0422\u0435\u043D\u043D\u0438\u0441",
1224
+ description: "\u0410\u0432\u0442\u043E\u0440 \u041F\u0435\u043D\u043A\u0438\u043D \u0412., 1986.",
1225
+ screenshots: [
1226
+ "TENNIS.RK-1.png",
1227
+ "TENNIS.RK-2.png"
1228
+ ]
1229
+ },
1230
+ {
1231
+ name: "TENNIS_X.RKR",
1232
+ title: "\u0418\u0433\u0440\u0430 \u0422\u0435\u043D\u043D\u0438\u0441",
1233
+ description: "\u0412\u041C\u0428 1987.",
1234
+ screenshots: [
1235
+ "TENNIS_X.RKR-1.png",
1236
+ "TENNIS_X.RKR-2.png"
1237
+ ]
1238
+ },
1239
+ {
1240
+ name: "TETR1.GAM",
1241
+ title: "\u0418\u0433\u0440\u0430 \u0422\u0435\u0442\u0440\u0438\u0441",
1242
+ description: "",
1243
+ screenshots: [
1244
+ "TETR1.GAM-1.png"
1245
+ ]
1246
+ },
1247
+ {
1248
+ name: "TETR2.GAM",
1249
+ title: "\u0418\u0433\u0440\u0430 \u0422\u0435\u043D\u043D\u0438\u0441",
1250
+ description: "",
1251
+ screenshots: [
1252
+ "TETR2.GAM-1.png",
1253
+ "TETR2.GAM-2.png"
1254
+ ]
1255
+ },
1256
+ {
1257
+ name: "TETRIS1.RKR",
1258
+ title: "\u0418\u0433\u0440\u0430 \u0422\u0435\u0442\u0440\u0438\u0441",
1259
+ description: "\u041A\u043E\u043B\u043E\u043C\u043D\u0430",
1260
+ screenshots: [
1261
+ "TETRIS1.RKR-1.png"
1262
+ ]
1263
+ },
1264
+ {
1265
+ name: "TETRIS2.RK",
1266
+ title: "\u0418\u0433\u0440\u0430 \u0422\u0435\u0442\u0440\u0438\u0441",
1267
+ description: "",
1268
+ screenshots: [
1269
+ "TETRIS2.RK-1.png",
1270
+ "TETRIS2.RK-2.png"
1271
+ ]
1272
+ },
1273
+ {
1274
+ name: "TOCHKI.GAM",
1275
+ title: "\u0418\u0433\u0440\u044B \u0416\u0438\u0437\u043D\u044C",
1276
+ description: "",
1277
+ screenshots: [
1278
+ "TOCHKI.GAM-1.png"
1279
+ ]
1280
+ },
1281
+ {
1282
+ name: "TORPATT.RK",
1283
+ title: "\u0418\u0433\u0440\u0430 \u0422\u043E\u0440\u043F\u0435\u0434\u043D\u0430\u044F \u0410\u0442\u0430\u043A\u0430",
1284
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0420\u0430\u0442\u043D\u0438\u043A\u043E\u0432 \u0410., \u0423\u041F\u041F-8 \u0412\u041E\u0421, 1990.",
1285
+ screenshots: [
1286
+ "TORPATT.RK-1.png",
1287
+ "TORPATT.RK-2.png"
1288
+ ]
1289
+ },
1290
+ {
1291
+ name: "TRASSA.RK",
1292
+ title: "\u0418\u0433\u0440\u0430 \u0422\u0440\u0430\u0441\u0441\u0430",
1293
+ description: "ORLO/R, 1992.",
1294
+ screenshots: [
1295
+ "TRASSA.RK-1.png"
1296
+ ]
1297
+ },
1298
+ {
1299
+ name: "UDAV.GAM",
1300
+ title: "\u0418\u0433\u0440\u0430 \u0423\u0434\u0430\u0432",
1301
+ description: "\u0410\u0432\u0442\u043E\u0440 \u041F\u043E\u043F\u043E\u0432 \u0421., \u041B\u042D\u041C\u0417, 1986.",
1302
+ screenshots: [
1303
+ "UDAV.GAM-1.png",
1304
+ "UDAV.GAM-2.png"
1305
+ ]
1306
+ },
1307
+ {
1308
+ name: "UDAW.GAM",
1309
+ title: "\u0418\u0433\u0440\u0430 \u0423\u0434\u0430\u0432",
1310
+ description: "\u0410\u0432\u0442\u043E\u0440 \u041F\u043E\u043F\u043E\u0432 \u0421., \u041B\u042D\u041C\u0417, 1986.",
1311
+ screenshots: [
1312
+ "UDAW.GAM-1.png",
1313
+ "UDAW.GAM-2.png"
1314
+ ]
1315
+ },
1316
+ {
1317
+ name: "UTKA.GAM",
1318
+ title: "\u0418\u0433\u0440\u0430 \u0423\u0442\u043A\u0430",
1319
+ description: "",
1320
+ screenshots: [
1321
+ "UTKA.GAM-1.png",
1322
+ "UTKA.GAM-2.png"
1323
+ ]
1324
+ },
1325
+ {
1326
+ name: "VOLCANO.RKR",
1327
+ title: "\u0418\u0433\u0440\u0430 Volcano, \u0432\u0435\u0440\u0441\u0438\u044F 1.0",
1328
+ description: "\u0421\u041A\u0411 DESIGN, BONY, 1987.",
1329
+ screenshots: [
1330
+ "VOLCANO.RKR-1.png",
1331
+ "VOLCANO.RKR-2.png"
1332
+ ]
1333
+ },
1334
+ {
1335
+ name: "WALL.RK",
1336
+ title: "\u0418\u0433\u0440\u0430 \u0421\u0442\u0435\u043D\u0430 / \u0410\u0440\u043A\u0430\u043D\u043E\u0438\u0434",
1337
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0411\u0430\u043D\u0434\u0435\u043D\u043E\u043A \u041C., \u041C\u043E\u0441\u043A\u0432\u0430, 1991.",
1338
+ screenshots: [
1339
+ "WALL.RK-1.png",
1340
+ "WALL.RK-2.png",
1341
+ "WALL.RK-3.png"
1342
+ ]
1343
+ },
1344
+ {
1345
+ name: "WEL.RKR",
1346
+ title: "\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 WEL 2.0",
1347
+ description: "",
1348
+ screenshots: [
1349
+ "WEL.RKR-1.png"
1350
+ ]
1351
+ },
1352
+ {
1353
+ name: "XON.GAM",
1354
+ title: "\u0418\u0433\u0440\u0430 Xonix \u041C\u0418\u041A\u0420\u041E\u041D",
1355
+ description: "",
1356
+ screenshots: [
1357
+ "XON.GAM-1.png",
1358
+ "XON.GAM-2.png"
1359
+ ]
1360
+ },
1361
+ {
1362
+ name: "XONIX-S.RKR",
1363
+ title: "\u0418\u0433\u0440\u0430 \u0425\u043Enix",
1364
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0421\u0435\u0434\u043E\u0432 E., \u041C\u043E\u0441\u043A\u0432\u0430, 1987.",
1365
+ screenshots: [
1366
+ "XONIX-S.RKR-1.png",
1367
+ "XONIX-S.RKR-2.png"
1368
+ ]
1369
+ },
1370
+ {
1371
+ name: "XONIX.GAM",
1372
+ title: "\u0418\u0433\u0440\u0430 \u041A\u0441\u043E\u043D\u0438\u043A\u0441/Xonix",
1373
+ description: "",
1374
+ screenshots: [
1375
+ "XONIX.GAM-1.png",
1376
+ "XONIX.GAM-2.png"
1377
+ ]
1378
+ },
1379
+ {
1380
+ name: "XONIX1.GAM",
1381
+ title: "\u0418\u0433\u0440\u0430 Xonix \u041C\u0418\u041A\u0420\u041E\u041D",
1382
+ description: "\u0424\u0430\u0439\u043B \u0441\u0438\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0442 XON.GAM.",
1383
+ screenshots: [
1384
+ "XONIX1.GAM-1.png",
1385
+ "XONIX1.GAM-2.png"
1386
+ ]
1387
+ },
1388
+ {
1389
+ name: "XONIX2.RKR",
1390
+ title: "\u0418\u0433\u0440\u0430 \u041A\u0441\u043E\u043D\u0438\u043A\u0441/Xonix",
1391
+ description: "\u0424\u0430\u0439\u043B \u0441\u0438\u043B\u044C\u043D\u043E \u043E\u0442\u043B\u0438\u0447\u0430\u0435\u0442\u0441\u044F \u043E\u0442 XONIX.GAM.",
1392
+ screenshots: [
1393
+ "XONIX2.RKR-1.png",
1394
+ "XONIX2.RKR-2.png"
1395
+ ]
1396
+ },
1397
+ {
1398
+ name: "XONIXZM.GAM",
1399
+ title: "\u0418\u0433\u0440\u044B Xonix, \u0417\u043C\u0435\u044F (ZM)",
1400
+ description: "",
1401
+ screenshots: [
1402
+ "XONIXZM.GAM-1.png",
1403
+ "XONIXZM.GAM-2.png",
1404
+ "XONIXZM.GAM-3.png",
1405
+ "XONIXZM.GAM-4.png"
1406
+ ]
1407
+ },
1408
+ {
1409
+ name: "ZAGIB.GAM",
1410
+ title: "\u0418\u0433\u0440\u0430 \u0417\u0430\u0433\u0438\u0431\u043E\u043D, \u0432\u0435\u0440\u0441\u0438\u044F 1.3",
1411
+ description: "GOP INC., \u041C\u0418\u042D\u041C, \u041C\u043E\u0441\u043A\u0432\u0430, 1987.",
1412
+ screenshots: [
1413
+ "ZAGIB.GAM-1.png",
1414
+ "ZAGIB.GAM-2.png"
1415
+ ]
1416
+ },
1417
+ {
1418
+ name: "ZMEIGOG.GAM",
1419
+ title: "\u0418\u0433\u0440\u0430 \u0417\u043C\u0435\u0439-\u0413\u043E\u0440\u044B\u043D\u044B\u0447",
1420
+ description: "",
1421
+ screenshots: [
1422
+ "ZMEIGOG.GAM-1.png",
1423
+ "ZMEIGOG.GAM-2.png"
1424
+ ]
1425
+ },
1426
+ {
1427
+ name: "ZMEYA.RK",
1428
+ title: "\u0418\u0433\u0440\u0430 \u0417\u043C\u0435\u044F-ZM",
1429
+ description: "\u0421\u041A\u0411 \u0424\u041A\u0420 \u0420\u0420\u0422\u0418 *DESIGN*, 1986.",
1430
+ screenshots: [
1431
+ "ZMEYA.RK-1.png",
1432
+ "ZMEYA.RK-2.png"
1433
+ ]
1434
+ },
1435
+ {
1436
+ name: "ZVZDNTIR.RK",
1437
+ title: "\u0417\u0432\u0435\u0437\u0434\u043D\u044B\u0439 \u0442\u0438\u0440",
1438
+ description: "",
1439
+ screenshots: [
1440
+ "ZVZDNTIR.RK-1.png",
1441
+ "ZVZDNTIR.RK-2.png"
1442
+ ]
1443
+ },
1444
+ {
1445
+ name: "adjust75.rkr",
1446
+ title: "\u0423\u0442\u0438\u043B\u0438\u0442\u0430 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0412\u041375/\u0412\u042257",
1447
+ description: "\u0410\u0432\u0442\u043E\u0440: \u0420\u0443\u0441\u043B\u0430\u043D \u0410\u043B\u0438\u043A\u0431\u0435\u0440\u043E\u0432, 2021.",
1448
+ screenshots: [
1449
+ "adjust75.rkr-1.png"
1450
+ ]
1451
+ },
1452
+ {
1453
+ name: "chars.bin",
1454
+ title: "\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u043F\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0442\u0430\u0431\u043B\u0438\u0446\u0443 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0420\u0430\u0434\u0438\u043E-86\u0420\u041A",
1455
+ description: '\u0410\u0432\u0442\u043E\u0440 \u0414\u0435\u043C\u0438\u043D \u0410\u043B\u0435\u043A\u0441\u0430\u043D\u0434\u0440, 2012 (<a href="https://github.com/begoon/rk86-maximite/blob/master/programs/chars/chars.asm">\u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442</a>).',
1456
+ screenshots: [
1457
+ "chars.bin-1.png"
1458
+ ]
1459
+ },
1460
+ {
1461
+ name: "cputest.bin",
1462
+ title: "\u0422\u0435\u0441\u0442 CPU TEST DIAGNOSTICS II V1.2",
1463
+ description: 'SUPERSOFT ASSOCIATES, 1981. \u0417\u0430\u043F\u0443\u0441\u043A\u0430\u0442\u044C "G100".',
1464
+ screenshots: []
1465
+ },
1466
+ {
1467
+ name: "mars3-lpe.rkr",
1468
+ title: "\u0418\u0433\u0440\u0430 \u041C\u0430\u0440\u0441",
1469
+ description: "\u0410\u0434\u0430\u043F\u0442\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u0441\u0432\u0435\u0442\u043E\u0432\u043E\u0433\u043E \u043F\u0435\u0440\u0430: \u0420\u0443\u0441\u043B\u0430\u043D \u0410\u043B\u0438\u043A\u0431\u0435\u0440\u043E\u0432, 2021.",
1470
+ screenshots: [
1471
+ "mars3-lpe.rkr-1.png",
1472
+ "mars3-lpe.rkr-2.png"
1473
+ ]
1474
+ },
1475
+ {
1476
+ name: "mon16.bin",
1477
+ title: "\u041E\u0440\u0438\u0433\u0438\u043D\u0430\u043B\u044C\u043D\u044B\u0439 \u041C\u043E\u043D\u0438\u0442\u043E\u0440 16\u041A\u0411",
1478
+ description: "",
1479
+ screenshots: []
1480
+ },
1481
+ {
1482
+ name: "mon32.bin",
1483
+ 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>',
1484
+ description: "",
1485
+ screenshots: []
1486
+ },
1487
+ {
1488
+ name: "mon32x4.bin",
1489
+ title: "\u041C\u043E\u043D\u0438\u0442\u043E\u0440 4\u041A\u0411",
1490
+ description: '\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 "P.C. MONITOR - READY".',
1491
+ screenshots: [
1492
+ "mon32x4.bin-1.png"
1493
+ ]
1494
+ },
1495
+ {
1496
+ name: "mon_okoshki.bin",
1497
+ title: "\u041C\u043E\u043D\u0438\u0442\u043E\u0440 \u0441 \u043E\u043A\u043D\u0430\u043C\u0438, \u043F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u044B\u0439 \u044D\u0442\u043E\u043C \u044D\u043C\u0443\u043B\u044F\u0442\u043E\u0440\u0435",
1498
+ description: `\u041A\u043E\u0434 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u0430\u043D \u043D\u0430 80%. \u041E\u0441\u043E\u0431\u043E\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435 \u0443\u0434\u0435\u043B\u044F\u043B\u043E\u0441\u044C \u043F\u043E\u0434\u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0435 \u0432\u044B\u0432\u043E\u0434\u0430 \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u043D\u0430 \u044D\u043A\u0440\u0430\u043D \u0434\u043B\u044F \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0438 \xAB\u043E\u043A\u043E\u043D\u043D\u043E\u0441\u0442\u0438\xBB. \u0414\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u044B D/M/L \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u044B. \u0414\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0430 "R" \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u0430 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044C ROM-\u0414\u0438\u0441\u043A \u0434\u043E 16 Mb. \u0414\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0430 "G <\u0441\u0442\u0430\u0440\u0442>,<\u0441\u0442\u043E\u043F>" \u043E\u0431\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0431\u0435\u0437 "RST" \u0438 \u043D\u0435 \u043F\u043E\u0440\u0442\u0438\u0442 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0443 (\u043D\u0435 \u0434\u043E \u043A\u043E\u043D\u0446\u0430 \u043E\u0442\u043B\u0430\u0436\u0435\u043D\u0430).
1499
+
1500
+ \u0410\u0432\u0442\u043E\u0440: \u0420\u0443\u0441\u043B\u0430\u043D \u0410\u043B\u0438\u043A\u0431\u0435\u0440\u043E\u0432, 2021.`,
1501
+ screenshots: [
1502
+ "mon_okoshki.bin-1.png"
1503
+ ]
1504
+ },
1505
+ {
1506
+ name: "okoshki-demo.rkr",
1507
+ title: "\u0414\u0435\u043C\u043E\u043D\u0441\u0442\u0440\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u041C\u043E\u043D\u0438\u0442\u043E\u0440\u0430 \xABmon_okoshki.bin\xBB",
1508
+ description: "\u0410\u0432\u0442\u043E\u0440: \u0420\u0443\u0441\u043B\u0430\u043D \u0410\u043B\u0438\u043A\u0431\u0435\u0440\u043E\u0432, 2021.",
1509
+ screenshots: [
1510
+ "okoshki-demo.rkr-1.png"
1511
+ ]
1512
+ },
1513
+ {
1514
+ name: "psi_1v3.rkr",
1515
+ title: '<a href="./psi_1v3.rkr/psi_1v3.txt">\u0423\u0442\u0438\u043B\u0438\u0442\u0430 \u0434\u043B\u044F \u043E\u043F\u044B\u0442\u043E\u0432 \u0441 \u0412\u041375/\u0412\u042257</a>',
1516
+ description: `\u041E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0446\u0438\u043A\u043B\u0430 \u0440\u0435\u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u041F\u0414\u041F \u043D\u0430 \u0437\u0430\u0434\u0430\u043D\u043D\u044B\u0439 \u043F\u0435\u0440\u0438\u043E\u0434 \u0434\u043B\u044F \u0430\u043D\u0430\u043B\u0438\u0437\u0430 \u0438 \u0432\u044B\u044F\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u0431\u043B\u0430\u0433\u043E\u043D\u0430\u0434\u0451\u0436\u043D\u044B\u0445 \u043C\u0438\u043A\u0440\u043E\u0441\u0445\u0435\u043C \u041E\u0417\u0423.
1517
+
1518
+ \u0410\u0432\u0442\u043E\u0440: \u0420\u0443\u0441\u043B\u0430\u043D \u0410\u043B\u0438\u043A\u0431\u0435\u0440\u043E\u0432, 2021.`,
1519
+ screenshots: [
1520
+ "psi_1v3.rkr-1.png"
1521
+ ]
1522
+ },
1523
+ {
1524
+ name: "rk8080pre.bin",
1525
+ title: '\u0422\u0435\u0441\u0442 "8080 Preliminary tests" \u043E\u0442 Ian Bartholomew',
1526
+ description: '\u0417\u0430\u043F\u0443\u0441\u043A\u0430\u0442\u044C "G100".',
1527
+ screenshots: []
1528
+ },
1529
+ {
1530
+ name: "rk86demo.bin",
1531
+ title: '<a href="https://github.com/begoon/rk86-3d-demo"/>\u041F\u0441\u0435\u0432\u0434\u043E-3D \u0434\u0435\u043C\u043E</a>',
1532
+ description: "\u0410\u0432\u0442\u043E\u0440 \u0414\u0435\u043C\u0438\u043D \u0410\u043B\u0435\u043A\u0441\u0430\u043D\u0434\u0440, 2012.",
1533
+ screenshots: [
1534
+ "rk86demo.bin-1.png"
1535
+ ]
1536
+ },
1537
+ {
1538
+ name: "rk86ex1.bin",
1539
+ title: '<a href="https://github.com/begoon/rk86-ex1/">\u0422\u0435\u0441\u0442 8080/8085 CPU Exerciser</a> \u0434\u043B\u044F \u0420\u0430\u0434\u0438\u043E-86\u0420\u041A',
1540
+ description: '\u0417\u0430\u043F\u0443\u0441\u043A\u0430\u0442\u044C "G100". \u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432: "G80".',
1541
+ screenshots: []
1542
+ },
1543
+ {
1544
+ name: "rk86test.bin",
1545
+ title: "\u0422\u0435\u0441\u0442 8080/8085 CPU DIAGNOSTIC VERSION 1.0",
1546
+ description: 'MICROCOSM ASSOCIATES, 1980. \u0417\u0430\u043F\u0443\u0441\u043A\u0430\u0442\u044C "G100".',
1547
+ screenshots: []
1548
+ },
1549
+ {
1550
+ name: "rk_font.bin",
1551
+ title: '"\u0420\u043E\u0434\u043D\u043E\u0439" \u0437\u043D\u0430\u043A\u043E\u0433\u0435\u043D\u0435\u0440\u0430\u0442\u043E\u0440/\u0448\u0440\u0438\u0444\u0442 \u0420\u041A',
1552
+ description: "",
1553
+ screenshots: []
1554
+ },
1555
+ {
1556
+ name: "screentest.bin",
1557
+ title: '\u0422\u0435\u0441\u0442\u043E\u0432\u0430\u044F <a href="https://github.com/begoon/rk86-maximite/blob/master/programs/test/test.asm">screentest.bin</a>',
1558
+ description: "\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0435 \u0431\u0435\u0433\u0443\u0449\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043F\u043E \u0432\u0441\u0435\u0439 \u044D\u043A\u0440\u0430\u043D\u043D\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438.",
1559
+ screenshots: [
1560
+ "screentest.bin-1.png"
1561
+ ]
1562
+ },
1563
+ {
1564
+ name: "sokoban.bin",
1565
+ title: '\u0418\u0433\u0440\u0430 <a href="https://github.com/begoon/rk86-maximite/blob/master/programs/sokoban/sokoban.asm">\u0421\u043E\u043A\u043E\u0431\u0430\u043D</a>, \u043A\u043B\u043E\u043D \u0434\u043E\u0441\u043E\u0432\u0441\u043A\u043E\u0439 \u0438\u0433\u0440\u044B Pusher',
1566
+ description: "\u0410\u0432\u0442\u043E\u0440: \u0414\u0435\u043C\u0438\u043D \u0410\u043B\u0435\u043A\u0441\u0430\u043D\u0434\u0440, 2012.",
1567
+ screenshots: [
1568
+ "sokoban.bin-1.png",
1569
+ "sokoban.bin-2.png"
1570
+ ]
1571
+ },
1572
+ {
1573
+ name: "viewport.rkr",
1574
+ title: "\u0414\u0435\u043C\u043E\u043D\u0441\u0442\u0440\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u041C\u043E\u043D\u0438\u0442\u043E\u0440\u0430 \xABmon_okoshki.bin\xBB",
1575
+ description: `\u0422\u043E\u0447\u043A\u0438 \u0432\u0445\u043E\u0434\u0430: G0/G1/G3/G3/G4.
1576
+
1577
+ \u0421\u0432\u0435\u0442\u043E\u0432\u043E\u0435 \u043F\u0435\u0440\u043E \u0441\u0447\u0438\u0442\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u0438\u0437 \u0412\u041375.
1578
+
1579
+ \u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u0435: \u0441\u0432\u0435\u0442\u043E\u0432\u043E\u0435 \u043F\u0435\u0440\u043E \u043F\u043E\u043A\u0430 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u044D\u043C\u0443\u043B\u044F\u0442\u043E\u0440\u0435.
1580
+
1581
+ \u0410\u0432\u0442\u043E\u0440: \u0420\u0443\u0441\u043B\u0430\u043D \u0410\u043B\u0438\u043A\u0431\u0435\u0440\u043E\u0432, 2021.`,
1582
+ screenshots: [
1583
+ "viewport.rkr-1.png",
1584
+ "viewport.rkr-2.png",
1585
+ "viewport.rkr-3.png"
1586
+ ]
1587
+ }
1588
+ ];
1589
+ });
1590
+
1591
+ // src/lib/hex.ts
1592
+ function hex(v, prefix) {
1593
+ return v.toString(16).toUpperCase();
1594
+ }
1595
+ function hex8(v, prefix) {
1596
+ return (prefix ? prefix : "") + hex(v & 255, prefix).padStart(2, "0");
1597
+ }
1598
+ function hex16(v, prefix) {
1599
+ return (prefix ? prefix : "") + hex(v & 65535, prefix).padStart(4, "0");
1600
+ }
1601
+ function hexArray(array) {
1602
+ return array.map((c) => hex8(c)).join(" ");
1603
+ }
1604
+ function fromHex(v) {
1605
+ if (typeof v === "string") {
1606
+ return v.startsWith("0x") ? parseInt(v, 16) : parseInt(v);
1607
+ }
1608
+ return v;
1609
+ }
1610
+
1611
+ // src/lib/i8080.ts
1612
+ class I8080 {
1613
+ memory;
1614
+ io;
1615
+ sp = 0;
1616
+ pc = 0;
1617
+ iff = 0;
1618
+ pf = 0;
1619
+ hf = 0;
1620
+ sf = 0;
1621
+ zf = 0;
1622
+ cf = 0;
1623
+ regs = [0, 0, 0, 0, 0, 0, 0, 0];
1624
+ static F_CARRY = 1;
1625
+ static F_UN1 = 2;
1626
+ static F_PARITY = 4;
1627
+ static F_UN3 = 8;
1628
+ static F_HCARRY = 16;
1629
+ static F_UN5 = 32;
1630
+ static F_ZERO = 64;
1631
+ static F_NEG = 128;
1632
+ parity_table = [
1633
+ [1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1],
1634
+ [0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0],
1635
+ [0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0],
1636
+ [1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1],
1637
+ [0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0],
1638
+ [1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1],
1639
+ [1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1],
1640
+ [0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0],
1641
+ [0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0],
1642
+ [1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1],
1643
+ [1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1],
1644
+ [0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0],
1645
+ [1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1],
1646
+ [0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0],
1647
+ [0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0],
1648
+ [1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1]
1649
+ ].flat();
1650
+ half_carry_table = [0, 0, 1, 0, 1, 0, 1, 1];
1651
+ sub_half_carry_table = [0, 1, 1, 1, 0, 0, 0, 1];
1652
+ constructor(machine) {
1653
+ this.memory = machine.memory;
1654
+ this.io = machine.io;
1655
+ }
1656
+ export() {
1657
+ const h8 = (n) => "0x" + hex8(n);
1658
+ const h16 = (n) => "0x" + hex16(n);
1659
+ return {
1660
+ a: h8(this.a()),
1661
+ sf: this.sf ? 1 : 0,
1662
+ zf: this.zf ? 1 : 0,
1663
+ hf: this.hf ? 1 : 0,
1664
+ pf: this.pf ? 1 : 0,
1665
+ cf: this.cf ? 1 : 0,
1666
+ bc: h16(this.bc()),
1667
+ de: h16(this.de()),
1668
+ hl: h16(this.hl()),
1669
+ sp: h16(this.sp),
1670
+ pc: h16(this.pc),
1671
+ iff: this.iff ? 1 : 0
1672
+ };
1673
+ }
1674
+ import(snapshot) {
1675
+ const h = fromHex;
1676
+ this.set_a(h(snapshot.a));
1677
+ this.sf = snapshot.sf;
1678
+ this.zf = snapshot.zf;
1679
+ this.hf = snapshot.hf;
1680
+ this.pf = snapshot.pf;
1681
+ this.cf = snapshot.cf;
1682
+ this.set_rp(0, h(snapshot.bc));
1683
+ this.set_rp(2, h(snapshot.de));
1684
+ this.set_rp(4, h(snapshot.hl));
1685
+ this.set_rp(6, h(snapshot.sp));
1686
+ this.pc = h(snapshot.pc);
1687
+ this.iff = h(snapshot.iff);
1688
+ }
1689
+ memory_read_byte(addr) {
1690
+ return this.memory.read(addr & 65535) & 255;
1691
+ }
1692
+ memory_write_byte(addr, w8) {
1693
+ this.memory.write(addr & 65535, w8 & 255);
1694
+ }
1695
+ memory_read_word(addr) {
1696
+ return this.memory_read_byte(addr + 1) << 8 | this.memory_read_byte(addr);
1697
+ }
1698
+ memory_write_word(addr, w16) {
1699
+ this.memory_write_byte(addr + 1, w16 >> 8);
1700
+ this.memory_write_byte(addr, w16 & 255);
1701
+ }
1702
+ reg(r) {
1703
+ return r != 6 ? this.regs[r] : this.memory_read_byte(this.hl());
1704
+ }
1705
+ set_reg(r, value) {
1706
+ const v8 = value & 255;
1707
+ if (r != 6)
1708
+ this.regs[r] = v8;
1709
+ else
1710
+ this.memory_write_byte(this.hl(), v8);
1711
+ }
1712
+ rp(r) {
1713
+ return r != 6 ? this.regs[r] << 8 | this.regs[r + 1] : this.sp;
1714
+ }
1715
+ set_rp(r, w16) {
1716
+ if (r != 6) {
1717
+ this.set_reg(r, w16 >> 8);
1718
+ this.set_reg(r + 1, w16 & 255);
1719
+ } else
1720
+ this.sp = w16;
1721
+ }
1722
+ store_flags() {
1723
+ let f = 0;
1724
+ if (this.sf)
1725
+ f |= I8080.F_NEG;
1726
+ else
1727
+ f &= ~I8080.F_NEG;
1728
+ if (this.zf)
1729
+ f |= I8080.F_ZERO;
1730
+ else
1731
+ f &= ~I8080.F_ZERO;
1732
+ if (this.hf)
1733
+ f |= I8080.F_HCARRY;
1734
+ else
1735
+ f &= ~I8080.F_HCARRY;
1736
+ if (this.pf)
1737
+ f |= I8080.F_PARITY;
1738
+ else
1739
+ f &= ~I8080.F_PARITY;
1740
+ if (this.cf)
1741
+ f |= I8080.F_CARRY;
1742
+ else
1743
+ f &= ~I8080.F_CARRY;
1744
+ f |= I8080.F_UN1;
1745
+ f &= ~I8080.F_UN3;
1746
+ f &= ~I8080.F_UN5;
1747
+ return f;
1748
+ }
1749
+ retrieve_flags(f) {
1750
+ this.sf = f & I8080.F_NEG ? 1 : 0;
1751
+ this.zf = f & I8080.F_ZERO ? 1 : 0;
1752
+ this.hf = f & I8080.F_HCARRY ? 1 : 0;
1753
+ this.pf = f & I8080.F_PARITY ? 1 : 0;
1754
+ this.cf = f & I8080.F_CARRY ? 1 : 0;
1755
+ }
1756
+ bc() {
1757
+ return this.rp(0);
1758
+ }
1759
+ de() {
1760
+ return this.rp(2);
1761
+ }
1762
+ hl() {
1763
+ return this.rp(4);
1764
+ }
1765
+ b() {
1766
+ return this.reg(0);
1767
+ }
1768
+ c() {
1769
+ return this.reg(1);
1770
+ }
1771
+ d() {
1772
+ return this.reg(2);
1773
+ }
1774
+ e() {
1775
+ return this.reg(3);
1776
+ }
1777
+ h() {
1778
+ return this.reg(4);
1779
+ }
1780
+ l() {
1781
+ return this.reg(5);
1782
+ }
1783
+ a() {
1784
+ return this.reg(7);
1785
+ }
1786
+ set_b(v) {
1787
+ this.set_reg(0, v);
1788
+ }
1789
+ set_c(v) {
1790
+ this.set_reg(1, v);
1791
+ }
1792
+ set_d(v) {
1793
+ this.set_reg(2, v);
1794
+ }
1795
+ set_e(v) {
1796
+ this.set_reg(3, v);
1797
+ }
1798
+ set_h(v) {
1799
+ this.set_reg(4, v);
1800
+ }
1801
+ set_l(v) {
1802
+ this.set_reg(5, v);
1803
+ }
1804
+ set_a(v) {
1805
+ this.set_reg(7, v);
1806
+ }
1807
+ next_pc_byte() {
1808
+ const v = this.memory_read_byte(this.pc);
1809
+ this.pc = this.pc + 1 & 65535;
1810
+ return v;
1811
+ }
1812
+ next_pc_word() {
1813
+ return this.next_pc_byte() | this.next_pc_byte() << 8;
1814
+ }
1815
+ inr(r) {
1816
+ let v = this.reg(r);
1817
+ v = v + 1 & 255;
1818
+ this.set_reg(r, v);
1819
+ this.sf = (v & 128) != 0 ? 1 : 0;
1820
+ this.zf = v == 0 ? 1 : 0;
1821
+ this.hf = (v & 15) == 0 ? 1 : 0;
1822
+ this.pf = this.parity_table[v];
1823
+ }
1824
+ dcr(r) {
1825
+ let v = this.reg(r);
1826
+ v = v - 1 & 255;
1827
+ this.set_reg(r, v);
1828
+ this.sf = (v & 128) != 0 ? 1 : 0;
1829
+ this.zf = v == 0 ? 1 : 0;
1830
+ this.hf = !((v & 15) == 15) ? 1 : 0;
1831
+ this.pf = this.parity_table[v];
1832
+ }
1833
+ add_im8(v, carry) {
1834
+ let a = this.a();
1835
+ const w16 = a + v + carry;
1836
+ const index = (a & 136) >> 1 | (v & 136) >> 2 | (w16 & 136) >> 3;
1837
+ a = w16 & 255;
1838
+ this.sf = (a & 128) != 0 ? 1 : 0;
1839
+ this.zf = a == 0 ? 1 : 0;
1840
+ this.hf = this.half_carry_table[index & 7] ? 1 : 0;
1841
+ this.pf = this.parity_table[a] ? 1 : 0;
1842
+ this.cf = (w16 & 256) != 0 ? 1 : 0;
1843
+ this.set_a(a);
1844
+ }
1845
+ add(r, carry) {
1846
+ this.add_im8(this.reg(r), carry);
1847
+ }
1848
+ sub_im8(v, carry) {
1849
+ let a = this.a();
1850
+ const w16 = a - v - carry & 65535;
1851
+ const index = (a & 136) >> 1 | (v & 136) >> 2 | (w16 & 136) >> 3;
1852
+ a = w16 & 255;
1853
+ this.sf = (a & 128) != 0 ? 1 : 0;
1854
+ this.zf = a == 0 ? 1 : 0;
1855
+ this.hf = !this.sub_half_carry_table[index & 7] ? 1 : 0;
1856
+ this.pf = this.parity_table[a] ? 1 : 0;
1857
+ this.cf = (w16 & 256) != 0 ? 1 : 0;
1858
+ this.set_a(a);
1859
+ }
1860
+ sub(r, carry) {
1861
+ this.sub_im8(this.reg(r), carry);
1862
+ }
1863
+ cmp_im8(v) {
1864
+ const a = this.a();
1865
+ this.sub_im8(v, 0);
1866
+ this.set_a(a);
1867
+ }
1868
+ cmp(r) {
1869
+ this.cmp_im8(this.reg(r));
1870
+ }
1871
+ ana_im8(v) {
1872
+ let a = this.a();
1873
+ this.hf = ((a | v) & 8) != 0 ? 1 : 0;
1874
+ a &= v;
1875
+ this.sf = (a & 128) != 0 ? 1 : 0;
1876
+ this.zf = a == 0 ? 1 : 0;
1877
+ this.pf = this.parity_table[a] ? 1 : 0;
1878
+ this.cf = 0;
1879
+ this.set_a(a);
1880
+ }
1881
+ ana(r) {
1882
+ this.ana_im8(this.reg(r));
1883
+ }
1884
+ xra_im8(v) {
1885
+ let a = this.a();
1886
+ a ^= v;
1887
+ this.sf = (a & 128) != 0 ? 1 : 0;
1888
+ this.zf = a == 0 ? 1 : 0;
1889
+ this.hf = 0;
1890
+ this.pf = this.parity_table[a];
1891
+ this.cf = 0;
1892
+ this.set_a(a);
1893
+ }
1894
+ xra(r) {
1895
+ this.xra_im8(this.reg(r));
1896
+ }
1897
+ ora_im8(v) {
1898
+ let a = this.a();
1899
+ a |= v;
1900
+ this.sf = (a & 128) != 0 ? 1 : 0;
1901
+ this.zf = a == 0 ? 1 : 0;
1902
+ this.hf = 0;
1903
+ this.pf = this.parity_table[a];
1904
+ this.cf = 0;
1905
+ this.set_a(a);
1906
+ }
1907
+ ora(r) {
1908
+ this.ora_im8(this.reg(r));
1909
+ }
1910
+ dad(r) {
1911
+ const hl = this.hl() + this.rp(r);
1912
+ this.cf = (hl & 65536) != 0 ? 1 : 0;
1913
+ this.set_h(hl >> 8);
1914
+ this.set_l(hl & 255);
1915
+ }
1916
+ call(w16) {
1917
+ this.push(this.pc);
1918
+ this.pc = w16;
1919
+ }
1920
+ ret() {
1921
+ return this.pc = this.pop();
1922
+ }
1923
+ pop() {
1924
+ const v = this.memory_read_word(this.sp);
1925
+ this.sp = this.sp + 2 & 65535;
1926
+ return v;
1927
+ }
1928
+ push(v) {
1929
+ this.sp = this.sp - 2 & 65535;
1930
+ this.memory_write_word(this.sp, v);
1931
+ }
1932
+ rst(addr) {
1933
+ this.push(this.pc);
1934
+ this.pc = addr;
1935
+ }
1936
+ execute(opcode) {
1937
+ let cpu_cycles = -1;
1938
+ switch (opcode) {
1939
+ default:
1940
+ alert("Oops! Unhandled opcode " + opcode.toString(16));
1941
+ break;
1942
+ case 0:
1943
+ case 8:
1944
+ case 16:
1945
+ case 24:
1946
+ case 32:
1947
+ case 40:
1948
+ case 48:
1949
+ case 56:
1950
+ cpu_cycles = 4;
1951
+ break;
1952
+ case 1:
1953
+ case 17:
1954
+ case 33:
1955
+ case 49:
1956
+ cpu_cycles = 10;
1957
+ this.set_rp(opcode >> 3, this.next_pc_word());
1958
+ break;
1959
+ case 2:
1960
+ case 18:
1961
+ cpu_cycles = 7;
1962
+ this.memory_write_byte(this.rp(opcode >> 3), this.a());
1963
+ break;
1964
+ case 3:
1965
+ case 19:
1966
+ case 35:
1967
+ case 51: {
1968
+ cpu_cycles = 5;
1969
+ const r = opcode >> 3;
1970
+ this.set_rp(r, this.rp(r) + 1 & 65535);
1971
+ break;
1972
+ }
1973
+ case 4:
1974
+ case 12:
1975
+ case 20:
1976
+ case 28:
1977
+ case 36:
1978
+ case 44:
1979
+ case 52:
1980
+ case 60:
1981
+ cpu_cycles = opcode != 52 ? 5 : 10;
1982
+ this.inr(opcode >> 3);
1983
+ break;
1984
+ case 5:
1985
+ case 13:
1986
+ case 21:
1987
+ case 29:
1988
+ case 37:
1989
+ case 45:
1990
+ case 53:
1991
+ case 61:
1992
+ cpu_cycles = opcode != 53 ? 5 : 10;
1993
+ this.dcr(opcode >> 3);
1994
+ break;
1995
+ case 6:
1996
+ case 14:
1997
+ case 22:
1998
+ case 30:
1999
+ case 38:
2000
+ case 46:
2001
+ case 54:
2002
+ case 62:
2003
+ cpu_cycles = opcode != 54 ? 7 : 10;
2004
+ this.set_reg(opcode >> 3, this.next_pc_byte());
2005
+ break;
2006
+ case 7: {
2007
+ cpu_cycles = 4;
2008
+ const a = this.a();
2009
+ this.cf = (a & 128) != 0 ? 1 : 0;
2010
+ this.set_a(a << 1 & 255 | this.cf);
2011
+ break;
2012
+ }
2013
+ case 9:
2014
+ case 25:
2015
+ case 41:
2016
+ case 57:
2017
+ cpu_cycles = 10;
2018
+ this.dad((opcode & 48) >> 3);
2019
+ break;
2020
+ case 10:
2021
+ case 26: {
2022
+ cpu_cycles = 7;
2023
+ const r = (opcode & 16) >> 3;
2024
+ this.set_a(this.memory_read_byte(this.rp(r)));
2025
+ break;
2026
+ }
2027
+ case 11:
2028
+ case 27:
2029
+ case 43:
2030
+ case 59: {
2031
+ cpu_cycles = 5;
2032
+ const r = (opcode & 48) >> 3;
2033
+ this.set_rp(r, this.rp(r) - 1 & 65535);
2034
+ break;
2035
+ }
2036
+ case 15:
2037
+ cpu_cycles = 4;
2038
+ this.cf = this.a() & 1;
2039
+ this.set_a(this.a() >> 1 | this.cf << 7);
2040
+ break;
2041
+ case 23: {
2042
+ cpu_cycles = 4;
2043
+ const w8 = this.cf;
2044
+ this.cf = (this.a() & 128) != 0 ? 1 : 0;
2045
+ this.set_a(this.a() << 1 | w8);
2046
+ break;
2047
+ }
2048
+ case 31: {
2049
+ cpu_cycles = 4;
2050
+ const w8 = this.cf;
2051
+ this.cf = this.a() & 1;
2052
+ this.set_a(this.a() >> 1 | w8 << 7);
2053
+ break;
2054
+ }
2055
+ case 34: {
2056
+ cpu_cycles = 16;
2057
+ const w16 = this.next_pc_word();
2058
+ this.memory_write_byte(w16, this.l());
2059
+ this.memory_write_byte(w16 + 1, this.h());
2060
+ break;
2061
+ }
2062
+ case 39: {
2063
+ cpu_cycles = 4;
2064
+ let carry = this.cf;
2065
+ let add = 0;
2066
+ const a = this.a();
2067
+ if (this.hf || (a & 15) > 9)
2068
+ add = 6;
2069
+ if (this.cf || a >> 4 > 9 || a >> 4 >= 9 && (a & 15) > 9) {
2070
+ add |= 96;
2071
+ carry = 1;
2072
+ }
2073
+ this.add_im8(add, 0);
2074
+ this.pf = this.parity_table[this.a()];
2075
+ this.cf = carry;
2076
+ break;
2077
+ }
2078
+ case 42: {
2079
+ cpu_cycles = 16;
2080
+ const w16 = this.next_pc_word();
2081
+ this.regs[5] = this.memory_read_byte(w16);
2082
+ this.regs[4] = this.memory_read_byte(w16 + 1);
2083
+ break;
2084
+ }
2085
+ case 47:
2086
+ cpu_cycles = 4;
2087
+ this.set_a(this.a() ^ 255);
2088
+ break;
2089
+ case 50:
2090
+ cpu_cycles = 13;
2091
+ this.memory_write_byte(this.next_pc_word(), this.a());
2092
+ break;
2093
+ case 55:
2094
+ cpu_cycles = 4;
2095
+ this.cf = 1;
2096
+ break;
2097
+ case 58:
2098
+ cpu_cycles = 13;
2099
+ this.set_a(this.memory_read_byte(this.next_pc_word()));
2100
+ break;
2101
+ case 63:
2102
+ cpu_cycles = 4;
2103
+ this.cf = this.cf ? 0 : 1;
2104
+ break;
2105
+ case 64:
2106
+ case 65:
2107
+ case 66:
2108
+ case 67:
2109
+ case 68:
2110
+ case 69:
2111
+ case 70:
2112
+ case 71:
2113
+ case 72:
2114
+ case 73:
2115
+ case 74:
2116
+ case 75:
2117
+ case 76:
2118
+ case 77:
2119
+ case 78:
2120
+ case 79:
2121
+ case 80:
2122
+ case 81:
2123
+ case 82:
2124
+ case 83:
2125
+ case 84:
2126
+ case 85:
2127
+ case 86:
2128
+ case 87:
2129
+ case 88:
2130
+ case 89:
2131
+ case 90:
2132
+ case 91:
2133
+ case 92:
2134
+ case 93:
2135
+ case 94:
2136
+ case 95:
2137
+ case 96:
2138
+ case 97:
2139
+ case 98:
2140
+ case 99:
2141
+ case 100:
2142
+ case 101:
2143
+ case 102:
2144
+ case 103:
2145
+ case 104:
2146
+ case 105:
2147
+ case 106:
2148
+ case 107:
2149
+ case 108:
2150
+ case 109:
2151
+ case 110:
2152
+ case 111:
2153
+ case 112:
2154
+ case 113:
2155
+ case 114:
2156
+ case 115:
2157
+ case 116:
2158
+ case 117:
2159
+ case 119:
2160
+ case 120:
2161
+ case 121:
2162
+ case 122:
2163
+ case 123:
2164
+ case 124:
2165
+ case 125:
2166
+ case 126:
2167
+ case 127: {
2168
+ const src = opcode & 7;
2169
+ const dst = opcode >> 3 & 7;
2170
+ cpu_cycles = src == 6 || dst == 6 ? 7 : 5;
2171
+ this.set_reg(dst, this.reg(src));
2172
+ break;
2173
+ }
2174
+ case 118:
2175
+ cpu_cycles = 4;
2176
+ this.pc = this.pc - 1 & 65535;
2177
+ break;
2178
+ case 128:
2179
+ case 129:
2180
+ case 130:
2181
+ case 131:
2182
+ case 132:
2183
+ case 133:
2184
+ case 134:
2185
+ case 135:
2186
+ case 136:
2187
+ case 137:
2188
+ case 138:
2189
+ case 139:
2190
+ case 140:
2191
+ case 141:
2192
+ case 142:
2193
+ case 143: {
2194
+ const r = opcode & 7;
2195
+ cpu_cycles = r != 6 ? 4 : 7;
2196
+ this.add(r, opcode & 8 ? this.cf : 0);
2197
+ break;
2198
+ }
2199
+ case 144:
2200
+ case 145:
2201
+ case 146:
2202
+ case 147:
2203
+ case 148:
2204
+ case 149:
2205
+ case 150:
2206
+ case 151:
2207
+ case 152:
2208
+ case 153:
2209
+ case 154:
2210
+ case 155:
2211
+ case 156:
2212
+ case 157:
2213
+ case 158:
2214
+ case 159: {
2215
+ const r = opcode & 7;
2216
+ cpu_cycles = r != 6 ? 4 : 7;
2217
+ this.sub(r, opcode & 8 ? this.cf : 0);
2218
+ break;
2219
+ }
2220
+ case 160:
2221
+ case 161:
2222
+ case 162:
2223
+ case 163:
2224
+ case 164:
2225
+ case 165:
2226
+ case 166:
2227
+ case 167: {
2228
+ const r = opcode & 7;
2229
+ cpu_cycles = r != 6 ? 4 : 7;
2230
+ this.ana(r);
2231
+ break;
2232
+ }
2233
+ case 168:
2234
+ case 169:
2235
+ case 170:
2236
+ case 171:
2237
+ case 172:
2238
+ case 173:
2239
+ case 174:
2240
+ case 175: {
2241
+ const r = opcode & 7;
2242
+ cpu_cycles = r != 6 ? 4 : 7;
2243
+ this.xra(r);
2244
+ break;
2245
+ }
2246
+ case 176:
2247
+ case 177:
2248
+ case 178:
2249
+ case 179:
2250
+ case 180:
2251
+ case 181:
2252
+ case 182:
2253
+ case 183: {
2254
+ const r = opcode & 7;
2255
+ cpu_cycles = r != 6 ? 4 : 7;
2256
+ this.ora(r);
2257
+ break;
2258
+ }
2259
+ case 184:
2260
+ case 185:
2261
+ case 186:
2262
+ case 187:
2263
+ case 188:
2264
+ case 189:
2265
+ case 190:
2266
+ case 191: {
2267
+ const r = opcode & 7;
2268
+ cpu_cycles = r != 6 ? 4 : 7;
2269
+ this.cmp(r);
2270
+ break;
2271
+ }
2272
+ case 192:
2273
+ case 200:
2274
+ case 208:
2275
+ case 216:
2276
+ case 224:
2277
+ case 232:
2278
+ case 240:
2279
+ case 248: {
2280
+ const flags = [this.zf, this.cf, this.pf, this.sf];
2281
+ const r = opcode >> 4 & 3;
2282
+ const direction = (opcode & 8) != 0 ? 1 : 0;
2283
+ cpu_cycles = 5;
2284
+ if (flags[r] == direction) {
2285
+ cpu_cycles = 11;
2286
+ this.ret();
2287
+ }
2288
+ break;
2289
+ }
2290
+ case 193:
2291
+ case 209:
2292
+ case 225:
2293
+ case 241: {
2294
+ cpu_cycles = 11;
2295
+ const r = (opcode & 48) >> 3;
2296
+ const w16 = this.pop();
2297
+ if (r != 6) {
2298
+ this.set_rp(r, w16);
2299
+ } else {
2300
+ this.set_a(w16 >> 8);
2301
+ this.retrieve_flags(w16 & 255);
2302
+ }
2303
+ break;
2304
+ }
2305
+ case 194:
2306
+ case 202:
2307
+ case 210:
2308
+ case 218:
2309
+ case 226:
2310
+ case 234:
2311
+ case 242:
2312
+ case 250: {
2313
+ cpu_cycles = 10;
2314
+ const flags = [this.zf, this.cf, this.pf, this.sf];
2315
+ const r = opcode >> 4 & 3;
2316
+ const direction = (opcode & 8) != 0 ? 1 : 0;
2317
+ const w16 = this.next_pc_word();
2318
+ this.pc = flags[r] == direction ? w16 : this.pc;
2319
+ break;
2320
+ }
2321
+ case 195:
2322
+ case 203:
2323
+ cpu_cycles = 10;
2324
+ this.pc = this.next_pc_word();
2325
+ break;
2326
+ case 196:
2327
+ case 204:
2328
+ case 212:
2329
+ case 220:
2330
+ case 228:
2331
+ case 236:
2332
+ case 244:
2333
+ case 252: {
2334
+ const flags = [this.zf, this.cf, this.pf, this.sf];
2335
+ const r = opcode >> 4 & 3;
2336
+ const direction = (opcode & 8) != 0 ? 1 : 0;
2337
+ const w16 = this.next_pc_word();
2338
+ cpu_cycles = 11;
2339
+ if (flags[r] == direction) {
2340
+ cpu_cycles = 17;
2341
+ this.call(w16);
2342
+ }
2343
+ break;
2344
+ }
2345
+ case 197:
2346
+ case 213:
2347
+ case 229:
2348
+ case 245: {
2349
+ cpu_cycles = 11;
2350
+ const r = (opcode & 48) >> 3;
2351
+ const w16 = r != 6 ? this.rp(r) : this.a() << 8 | this.store_flags();
2352
+ this.push(w16);
2353
+ break;
2354
+ }
2355
+ case 198:
2356
+ cpu_cycles = 7;
2357
+ this.add_im8(this.next_pc_byte(), 0);
2358
+ break;
2359
+ case 199:
2360
+ case 207:
2361
+ case 215:
2362
+ case 223:
2363
+ case 231:
2364
+ case 239:
2365
+ case 247:
2366
+ case 255:
2367
+ this.rst(opcode & 56);
2368
+ cpu_cycles = 11;
2369
+ break;
2370
+ case 201:
2371
+ case 217:
2372
+ cpu_cycles = 10;
2373
+ this.ret();
2374
+ break;
2375
+ case 205:
2376
+ case 221:
2377
+ case 237:
2378
+ case 253:
2379
+ cpu_cycles = 17;
2380
+ this.call(this.next_pc_word());
2381
+ break;
2382
+ case 206:
2383
+ cpu_cycles = 7;
2384
+ this.add_im8(this.next_pc_byte(), this.cf);
2385
+ break;
2386
+ case 211:
2387
+ cpu_cycles = 10;
2388
+ this.io.output(this.next_pc_byte(), this.a());
2389
+ break;
2390
+ case 214:
2391
+ cpu_cycles = 7;
2392
+ this.sub_im8(this.next_pc_byte(), 0);
2393
+ break;
2394
+ case 219:
2395
+ cpu_cycles = 10;
2396
+ this.set_a(this.io.input(this.next_pc_byte()));
2397
+ break;
2398
+ case 222:
2399
+ cpu_cycles = 7;
2400
+ this.sub_im8(this.next_pc_byte(), this.cf);
2401
+ break;
2402
+ case 227: {
2403
+ cpu_cycles = 18;
2404
+ const w16 = this.memory_read_word(this.sp);
2405
+ this.memory_write_word(this.sp, this.hl());
2406
+ this.set_l(w16 & 255);
2407
+ this.set_h(w16 >> 8);
2408
+ break;
2409
+ }
2410
+ case 230:
2411
+ cpu_cycles = 7;
2412
+ this.ana_im8(this.next_pc_byte());
2413
+ break;
2414
+ case 233:
2415
+ cpu_cycles = 5;
2416
+ this.pc = this.hl();
2417
+ break;
2418
+ case 235: {
2419
+ cpu_cycles = 4;
2420
+ const l = this.l();
2421
+ this.set_l(this.e());
2422
+ this.set_e(l);
2423
+ const h = this.h();
2424
+ this.set_h(this.d());
2425
+ this.set_d(h);
2426
+ break;
2427
+ }
2428
+ case 238:
2429
+ cpu_cycles = 7;
2430
+ this.xra_im8(this.next_pc_byte());
2431
+ break;
2432
+ case 243:
2433
+ case 251:
2434
+ cpu_cycles = 4;
2435
+ this.iff = (opcode & 8) != 0 ? 1 : 0;
2436
+ this.io.interrupt(this.iff);
2437
+ break;
2438
+ case 246:
2439
+ cpu_cycles = 7;
2440
+ this.ora_im8(this.next_pc_byte());
2441
+ break;
2442
+ case 249:
2443
+ cpu_cycles = 5;
2444
+ this.sp = this.hl();
2445
+ break;
2446
+ case 254:
2447
+ cpu_cycles = 7;
2448
+ this.cmp_im8(this.next_pc_byte());
2449
+ break;
2450
+ }
2451
+ return cpu_cycles;
2452
+ }
2453
+ instruction() {
2454
+ return this.execute(this.next_pc_byte());
2455
+ }
2456
+ jump(addr) {
2457
+ this.pc = addr & 65535;
2458
+ }
2459
+ }
2460
+
2461
+ // src/lib/rk86_file_parser.ts
2462
+ var extract_rk86_word = function(v, i) {
2463
+ return (v[i] & 255) << 8 | v[i + 1] & 255;
2464
+ };
2465
+ var to_text = (binary) => binary.reduce((a, x) => a + String.fromCharCode(x), "");
2466
+ var is_hex_file = (image) => to_text(image.slice(0, 6)) === "#!rk86";
2467
+ var convert_hex_to_binary = function(text) {
2468
+ const lines = text.split(`
2469
+ `).filter((line) => line.trim().length).filter((line) => !line.startsWith(";") && !line.startsWith("#"));
2470
+ const image = [];
2471
+ for (const line of lines) {
2472
+ const hex_line = line.slice(5).trim();
2473
+ const binary_line = hex_line.split(" ").map((v) => parseInt(v, 16));
2474
+ image.push(...binary_line);
2475
+ }
2476
+ return image;
2477
+ };
2478
+ var file_ext = (filename) => {
2479
+ const groups = filename.match(".*\\.(.*)$");
2480
+ return groups ? groups[1] : "";
2481
+ };
2482
+ var parse_rk86_binary = (name, input) => {
2483
+ let file = {};
2484
+ file.name = name.split("/").slice(-1)[0];
2485
+ let image = input;
2486
+ if (is_hex_file(image)) {
2487
+ const text = to_text(image);
2488
+ image = convert_hex_to_binary(text);
2489
+ file = { ...file, ...extact_metadata(text) };
2490
+ if (file.start != null)
2491
+ file.start = parseInt(file.start, 16);
2492
+ if (file.entry != null)
2493
+ file.entry = parseInt(file.entry, 16);
2494
+ }
2495
+ if (image.length > 65536) {
2496
+ throw new Error(`\u043E\u0448\u0438\u0431\u043A\u0430: \u0434\u043B\u0438\u043D\u0430 \u0444\u0430\u0439\u043B\u0430 [${file.name}] ${image.length} \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u0435\u0442 65556`);
2497
+ }
2498
+ const ext = file_ext(file.name);
2499
+ if (ext === "bin" || ext === "") {
2500
+ file.size = image.length;
2501
+ if (file.start == null) {
2502
+ file.start = file.name.match(/^mon/) ? 65536 - file.size : 0;
2503
+ }
2504
+ file.end = file.start + file.size - 1;
2505
+ file.image = image;
2506
+ if (file.entry == null) {
2507
+ file.entry = file.start;
2508
+ }
2509
+ } else {
2510
+ let i = 0;
2511
+ if ((image[i] & 255) == 230)
2512
+ ++i;
2513
+ file.start = extract_rk86_word(image, i);
2514
+ file.end = extract_rk86_word(image, i + 2);
2515
+ i += 4;
2516
+ file.size = file.end - file.start + 1;
2517
+ file.image = image.slice(i, i + file.size);
2518
+ file.entry = file.entry != null ? file.entry : file.start;
2519
+ if (file.name == "PVO.GAM")
2520
+ file.entry = 13312;
2521
+ }
2522
+ return file;
2523
+ };
2524
+ function extact_metadata(text) {
2525
+ const initial = {};
2526
+ return [...text.matchAll(/!([^ =\t\n\r]+?)=([^ \t\r\n]+)/g)].map((group) => group.slice(1)).reduce((a, [key, value]) => (a[key] = value, a), initial);
2527
+ }
2528
+
2529
+ // src/lib/rk86_font.ts
2530
+ function rk86_font_image() {
2531
+ 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==";
2532
+ }
2533
+
2534
+ // src/lib/rk86_keyboard.ts
2535
+ class Keyboard {
2536
+ state;
2537
+ modifiers;
2538
+ keydown = (code) => {
2539
+ if (code === "ShiftLeft" || code === "ShiftRight")
2540
+ this.modifiers &= ~SS;
2541
+ if (code === "ControlLeft")
2542
+ this.modifiers &= ~US;
2543
+ if (code === "F10")
2544
+ this.modifiers &= ~RL;
2545
+ const key = Keyboard.key_table[code];
2546
+ if (key)
2547
+ this.state[key[0]] &= ~key[1];
2548
+ };
2549
+ keyup = (code) => {
2550
+ if (code === "ShiftLeft" || code === "ShiftRight")
2551
+ this.modifiers |= SS;
2552
+ if (code === "ControlLeft")
2553
+ this.modifiers |= US;
2554
+ if (code === "F10")
2555
+ this.modifiers |= RL;
2556
+ const key = Keyboard.key_table[code];
2557
+ if (key)
2558
+ this.state[key[0]] |= key[1];
2559
+ };
2560
+ onkeydown = (code) => this.keydown(code);
2561
+ onkeyup = (code) => this.keyup(code);
2562
+ constructor() {
2563
+ this.reset();
2564
+ }
2565
+ reset() {
2566
+ this.state = [255, 255, 255, 255, 255, 255, 255, 255];
2567
+ this.modifiers = 255;
2568
+ }
2569
+ export() {
2570
+ const h8 = (n) => "0x" + hex8(n);
2571
+ return {
2572
+ state: this.state.map(h8),
2573
+ modifiers: h8(this.modifiers)
2574
+ };
2575
+ }
2576
+ import(snapshot) {
2577
+ this.state = snapshot.state.map(fromHex);
2578
+ this.modifiers = fromHex(snapshot.modifiers);
2579
+ }
2580
+ static key_table = {
2581
+ F8: [0, 1],
2582
+ F9: [0, 2],
2583
+ F5: [0, 4],
2584
+ F1: [0, 8],
2585
+ F2: [0, 16],
2586
+ F3: [0, 32],
2587
+ F4: [0, 64],
2588
+ Tab: [1, 1],
2589
+ Backquote: [1, 2],
2590
+ Enter: [1, 4],
2591
+ Backspace: [1, 8],
2592
+ ArrowLeft: [1, 16],
2593
+ ArrowUp: [1, 32],
2594
+ ArrowRight: [1, 64],
2595
+ ArrowDown: [1, 128],
2596
+ Digit0: [2, 1],
2597
+ Digit1: [2, 2],
2598
+ Digit2: [2, 4],
2599
+ Digit3: [2, 8],
2600
+ Digit4: [2, 16],
2601
+ Digit5: [2, 32],
2602
+ Digit6: [2, 64],
2603
+ Digit7: [2, 128],
2604
+ Digit8: [3, 1],
2605
+ Digit9: [3, 2],
2606
+ F6: [3, 4],
2607
+ Semicolon: [3, 8],
2608
+ Comma: [3, 16],
2609
+ Minus: [3, 32],
2610
+ Period: [3, 64],
2611
+ Slash: [3, 128],
2612
+ F7: [4, 1],
2613
+ KeyA: [4, 2],
2614
+ KeyB: [4, 4],
2615
+ KeyC: [4, 8],
2616
+ KeyD: [4, 16],
2617
+ KeyE: [4, 32],
2618
+ KeyF: [4, 64],
2619
+ KeyG: [4, 128],
2620
+ KeyH: [5, 1],
2621
+ KeyI: [5, 2],
2622
+ KeyJ: [5, 4],
2623
+ KeyK: [5, 8],
2624
+ KeyL: [5, 16],
2625
+ KeyM: [5, 32],
2626
+ KeyN: [5, 64],
2627
+ KeyO: [5, 128],
2628
+ KeyP: [6, 1],
2629
+ KeyQ: [6, 2],
2630
+ KeyR: [6, 4],
2631
+ KeyS: [6, 8],
2632
+ KeyT: [6, 16],
2633
+ KeyU: [6, 32],
2634
+ KeyV: [6, 64],
2635
+ KeyW: [6, 128],
2636
+ KeyX: [7, 1],
2637
+ KeyY: [7, 2],
2638
+ KeyZ: [7, 4],
2639
+ BracketLeft: [7, 8],
2640
+ Backslash: [7, 16],
2641
+ BracketRight: [7, 32],
2642
+ Quote: [7, 64],
2643
+ Space: [7, 128]
2644
+ };
2645
+ }
2646
+ var SS = 32;
2647
+ var US = 64;
2648
+ var RL = 128;
2649
+
2650
+ // src/lib/hex_map.ts
2651
+ function create(array, width = 16) {
2652
+ const v = {};
2653
+ for (let i = 0;i < array.length; i += width) {
2654
+ v[":" + hex16(i).toString()] = hexArray(array.slice(i, i + width));
2655
+ }
2656
+ return v;
2657
+ }
2658
+ function parse(hex2) {
2659
+ const array = [];
2660
+ for (let [label, line] of Object.entries(hex2)) {
2661
+ const address = parseInt(label.slice(1), 16);
2662
+ const line_values = line.split(" ").map((value) => parseInt(value, 16));
2663
+ for (let j = 0;j < line_values.length; j++) {
2664
+ array[address + j] = line_values[j];
2665
+ }
2666
+ }
2667
+ return array;
2668
+ }
2669
+
2670
+ // src/lib/rk86_memory.ts
2671
+ class Memory {
2672
+ buf = [];
2673
+ update_ruslat = () => {};
2674
+ machine;
2675
+ vg75_c001_00_cmd = 0;
2676
+ video_screen_size_x_buf = 0;
2677
+ video_screen_size_y_buf = 0;
2678
+ ik57_e008_80_cmd = 0;
2679
+ vg75_c001_80_cmd = 0;
2680
+ cursor_x_buf = 0;
2681
+ cursor_y_buf = 0;
2682
+ vg75_c001_60_cmd = 0;
2683
+ tape_8002_as_output = 0;
2684
+ video_memory_base_buf = 0;
2685
+ video_memory_size_buf = 0;
2686
+ video_memory_base = 0;
2687
+ video_memory_size = 0;
2688
+ video_screen_size_x = 0;
2689
+ video_screen_size_y = 0;
2690
+ video_screen_cursor_x = 0;
2691
+ video_screen_cursor_y = 0;
2692
+ last_access_address = 0;
2693
+ last_access_operation = undefined;
2694
+ constructor(machine) {
2695
+ this.machine = machine;
2696
+ this.init();
2697
+ this.invalidate_access_variables();
2698
+ }
2699
+ init() {
2700
+ this.buf = new Array(65536).fill(0);
2701
+ this.vg75_c001_00_cmd = 0;
2702
+ this.video_screen_size_x_buf = 0;
2703
+ this.video_screen_size_y_buf = 0;
2704
+ this.ik57_e008_80_cmd = 0;
2705
+ this.vg75_c001_80_cmd = 0;
2706
+ this.cursor_x_buf = 0;
2707
+ this.cursor_y_buf = 0;
2708
+ this.vg75_c001_60_cmd = 0;
2709
+ this.tape_8002_as_output = 0;
2710
+ this.video_memory_base_buf = 0;
2711
+ this.video_memory_size_buf = 0;
2712
+ this.video_memory_base = 0;
2713
+ this.video_memory_size = 0;
2714
+ this.video_screen_size_x = 0;
2715
+ this.video_screen_size_y = 0;
2716
+ this.video_screen_cursor_x = 0;
2717
+ this.video_screen_cursor_y = 0;
2718
+ }
2719
+ zero_ram() {
2720
+ for (let i = 0;i < 32768; ++i)
2721
+ this.buf[i] = 0;
2722
+ }
2723
+ snapshot(from, sz) {
2724
+ return this.buf.slice(from, from + sz);
2725
+ }
2726
+ export() {
2727
+ const h16 = (n) => "0x" + hex16(n);
2728
+ return {
2729
+ vg75_c001_00_cmd: this.vg75_c001_00_cmd,
2730
+ video_screen_size_x_buf: this.video_screen_size_x_buf,
2731
+ video_screen_size_y_buf: this.video_screen_size_y_buf,
2732
+ vg75_c001_80_cmd: this.vg75_c001_80_cmd,
2733
+ cursor_x_buf: this.cursor_x_buf,
2734
+ cursor_y_buf: this.cursor_y_buf,
2735
+ vg75_c001_60_cmd: this.vg75_c001_60_cmd,
2736
+ ik57_e008_80_cmd: this.ik57_e008_80_cmd,
2737
+ tape_8002_as_output: this.tape_8002_as_output,
2738
+ video_memory_base_buf: h16(this.video_memory_base_buf),
2739
+ video_memory_size_buf: h16(this.video_memory_size_buf),
2740
+ video_memory_base: h16(this.video_memory_base),
2741
+ video_memory_size: h16(this.video_memory_size),
2742
+ video_screen_size_x: this.video_screen_size_x,
2743
+ video_screen_size_y: this.video_screen_size_y,
2744
+ video_screen_cursor_x: this.video_screen_cursor_x,
2745
+ video_screen_cursor_y: this.video_screen_cursor_y,
2746
+ last_access_address: h16(this.last_access_address),
2747
+ last_access_operation: this.last_access_operation,
2748
+ memory: create(this.buf)
2749
+ };
2750
+ }
2751
+ import = (snapshot) => {
2752
+ const h = fromHex;
2753
+ this.vg75_c001_00_cmd = snapshot.vg75_c001_00_cmd;
2754
+ this.video_screen_size_x_buf = snapshot.video_screen_size_x_buf;
2755
+ this.video_screen_size_y_buf = snapshot.video_screen_size_y_buf;
2756
+ this.vg75_c001_80_cmd = snapshot.vg75_c001_80_cmd;
2757
+ this.cursor_x_buf = snapshot.cursor_x_buf;
2758
+ this.cursor_y_buf = snapshot.cursor_y_buf;
2759
+ this.vg75_c001_60_cmd = snapshot.vg75_c001_60_cmd;
2760
+ this.ik57_e008_80_cmd = snapshot.ik57_e008_80_cmd;
2761
+ this.tape_8002_as_output = snapshot.tape_8002_as_output;
2762
+ this.video_memory_base_buf = h(snapshot.video_memory_base_buf);
2763
+ this.video_memory_size_buf = h(snapshot.video_memory_size_buf);
2764
+ this.video_memory_base = h(snapshot.video_memory_base);
2765
+ this.video_memory_size = h(snapshot.video_memory_size);
2766
+ this.video_screen_size_x = snapshot.video_screen_size_x;
2767
+ this.video_screen_size_y = snapshot.video_screen_size_y;
2768
+ this.video_screen_cursor_x = snapshot.video_screen_cursor_x;
2769
+ this.video_screen_cursor_y = snapshot.video_screen_cursor_y;
2770
+ this.last_access_address = h(snapshot.last_access_address);
2771
+ this.last_access_operation = snapshot.last_access_operation;
2772
+ this.buf = parse(snapshot.memory);
2773
+ };
2774
+ invalidate_access_variables() {
2775
+ this.last_access_address = 0;
2776
+ this.last_access_operation = undefined;
2777
+ }
2778
+ length() {
2779
+ return 65536;
2780
+ }
2781
+ read_raw(address) {
2782
+ const addr = address & 65535;
2783
+ return this.buf[addr] & 255;
2784
+ }
2785
+ read(address) {
2786
+ const addr = address & 65535;
2787
+ this.last_access_address = addr;
2788
+ this.last_access_operation = "read";
2789
+ if (addr === 32770)
2790
+ return this.machine.keyboard.modifiers;
2791
+ if (addr === 32769) {
2792
+ const keyboard_state = this.machine.keyboard.state;
2793
+ let ch = 255;
2794
+ const kbd_scanline = ~this.buf[32768];
2795
+ for (let i = 0;i < 8; i++)
2796
+ if (1 << i & kbd_scanline)
2797
+ ch &= keyboard_state[i];
2798
+ return ch;
2799
+ }
2800
+ if (addr === 49153) {
2801
+ return 32 | (this.machine.screen.light_pen_active ? 16 : 0);
2802
+ }
2803
+ if (addr === 49152) {
2804
+ if (this.vg75_c001_60_cmd === 1) {
2805
+ this.vg75_c001_60_cmd = 2;
2806
+ return this.machine.screen.light_pen_x;
2807
+ }
2808
+ if (this.vg75_c001_60_cmd === 2) {
2809
+ this.vg75_c001_60_cmd = 0;
2810
+ return this.machine.screen.light_pen_y;
2811
+ }
2812
+ return 0;
2813
+ }
2814
+ return this.buf[addr];
2815
+ }
2816
+ write_raw(address, value8) {
2817
+ const addr = address & 65535;
2818
+ const byte = value8 & 255;
2819
+ this.buf[addr] = byte;
2820
+ }
2821
+ write = (address, value8) => {
2822
+ const addr = address & 65535;
2823
+ const byte = value8 & 255;
2824
+ this.last_access_address = addr;
2825
+ this.last_access_operation = "write";
2826
+ if (addr >= 63488)
2827
+ return;
2828
+ this.buf[addr] = byte;
2829
+ const peripheral_reg = addr & 61439;
2830
+ if (peripheral_reg === 32771) {
2831
+ if (byte & 128) {} else {
2832
+ const bit = byte >> 1 & 3;
2833
+ const value = byte & 1;
2834
+ if (bit === 3)
2835
+ this.set_ruslat(value);
2836
+ }
2837
+ return;
2838
+ }
2839
+ if (peripheral_reg === 49153 && byte === 39)
2840
+ return;
2841
+ if (peripheral_reg === 49153 && byte === 224)
2842
+ return;
2843
+ if (peripheral_reg === 49153 && byte === 128) {
2844
+ this.vg75_c001_80_cmd = 1;
2845
+ return;
2846
+ }
2847
+ if (peripheral_reg === 49152 && this.vg75_c001_80_cmd === 1) {
2848
+ this.vg75_c001_80_cmd += 1;
2849
+ this.cursor_x_buf = byte + 1;
2850
+ return;
2851
+ }
2852
+ if (peripheral_reg === 49152 && this.vg75_c001_80_cmd === 2) {
2853
+ this.cursor_y_buf = byte + 1;
2854
+ this.machine.screen.set_cursor(this.cursor_x_buf - 1, this.cursor_y_buf - 1);
2855
+ this.video_screen_cursor_x = this.cursor_x_buf;
2856
+ this.video_screen_cursor_y = this.cursor_y_buf;
2857
+ this.vg75_c001_80_cmd = 0;
2858
+ return;
2859
+ }
2860
+ if (peripheral_reg === 49153 && byte === 96) {
2861
+ if (this.machine.screen.light_pen_active)
2862
+ this.vg75_c001_60_cmd = 1;
2863
+ return;
2864
+ }
2865
+ if (peripheral_reg === 49153 && byte === 0) {
2866
+ this.vg75_c001_00_cmd = 1;
2867
+ return;
2868
+ }
2869
+ if (peripheral_reg === 49152 && this.vg75_c001_00_cmd === 1) {
2870
+ this.video_screen_size_x_buf = (byte & 127) + 1;
2871
+ this.vg75_c001_00_cmd += 1;
2872
+ return;
2873
+ }
2874
+ if (peripheral_reg === 49152 && this.vg75_c001_00_cmd === 2) {
2875
+ this.video_screen_size_y_buf = (byte & 63) + 1;
2876
+ this.vg75_c001_00_cmd += 1;
2877
+ return;
2878
+ }
2879
+ if (peripheral_reg === 49152 && this.vg75_c001_00_cmd === 3) {
2880
+ this.vg75_c001_00_cmd += 1;
2881
+ return;
2882
+ }
2883
+ if (peripheral_reg === 49152 && this.vg75_c001_00_cmd === 4) {
2884
+ this.vg75_c001_00_cmd = 0;
2885
+ if (this.video_screen_size_x_buf && this.video_screen_size_y_buf) {
2886
+ this.video_screen_size_x = this.video_screen_size_x_buf;
2887
+ this.video_screen_size_y = this.video_screen_size_y_buf;
2888
+ this.machine.screen.set_geometry(this.video_screen_size_x, this.video_screen_size_y);
2889
+ }
2890
+ return;
2891
+ }
2892
+ if (peripheral_reg === 57352 && byte === 128) {
2893
+ this.ik57_e008_80_cmd = 1;
2894
+ this.tape_8002_as_output = 1;
2895
+ return;
2896
+ }
2897
+ if (peripheral_reg === 57348 && this.ik57_e008_80_cmd === 1) {
2898
+ this.video_memory_base_buf = byte;
2899
+ this.ik57_e008_80_cmd += 1;
2900
+ return;
2901
+ }
2902
+ if (peripheral_reg === 57348 && this.ik57_e008_80_cmd === 2) {
2903
+ this.video_memory_base_buf |= byte << 8;
2904
+ this.ik57_e008_80_cmd += 1;
2905
+ return;
2906
+ }
2907
+ if (peripheral_reg === 57349 && this.ik57_e008_80_cmd === 3) {
2908
+ this.video_memory_size_buf = byte;
2909
+ this.ik57_e008_80_cmd += 1;
2910
+ return;
2911
+ }
2912
+ if (peripheral_reg === 57349 && this.ik57_e008_80_cmd === 4) {
2913
+ this.video_memory_size_buf = ((this.video_memory_size_buf | byte << 8) & 16383) + 1;
2914
+ this.ik57_e008_80_cmd = 0;
2915
+ this.video_memory_base = this.video_memory_base_buf;
2916
+ this.video_memory_size = this.video_memory_size_buf;
2917
+ this.machine.screen.set_video_memory(this.video_memory_base);
2918
+ return;
2919
+ }
2920
+ if (peripheral_reg === 57352 && byte === 164) {
2921
+ this.tape_8002_as_output = 0;
2922
+ return;
2923
+ }
2924
+ if (addr === 32770) {
2925
+ if (this.tape_8002_as_output) {
2926
+ this.tape_write_bit(byte & 1);
2927
+ }
2928
+ return;
2929
+ }
2930
+ };
2931
+ tape_write_bit(bit) {
2932
+ this.machine.tape.write_bit(bit);
2933
+ }
2934
+ set_ruslat(value) {
2935
+ if (this.update_ruslat)
2936
+ this.update_ruslat(value);
2937
+ }
2938
+ load_file(file) {
2939
+ for (let i = file.start;i <= file.end; ++i) {
2940
+ this.write_raw(i, file.image[i - file.start]);
2941
+ }
2942
+ }
2943
+ }
2944
+
2945
+ // src/lib/SoundPlayer.ts
2946
+ class SoundPlayer {
2947
+ audioCtx;
2948
+ gainNode;
2949
+ oscillator = null;
2950
+ constructor(audioContext) {
2951
+ this.audioCtx = audioContext;
2952
+ this.gainNode = this.audioCtx.createGain();
2953
+ this.gainNode.connect(this.audioCtx.destination);
2954
+ }
2955
+ play(freq, volume, wave) {
2956
+ this.oscillator = this.audioCtx.createOscillator();
2957
+ this.oscillator.connect(this.gainNode);
2958
+ this.oscillator.frequency.setValueAtTime(freq, this.audioCtx.currentTime);
2959
+ if (wave) {
2960
+ this.oscillator.type = wave;
2961
+ }
2962
+ this.gainNode.gain.value = volume;
2963
+ this.oscillator.start();
2964
+ }
2965
+ stop(when) {
2966
+ const offset = when || 0.05;
2967
+ if (this.oscillator)
2968
+ this.oscillator.stop(this.audioCtx.currentTime + offset);
2969
+ }
2970
+ }
2971
+
2972
+ // src/lib/rk86_sound.ts
2973
+ class Sound {
2974
+ volume = 0.05;
2975
+ stop_timer = null;
2976
+ previous_tone = null;
2977
+ player;
2978
+ constructor() {
2979
+ const ctx = new AudioContext;
2980
+ ctx.resume();
2981
+ this.player = new SoundPlayer(ctx);
2982
+ }
2983
+ set_stop_timer(duration) {
2984
+ return setTimeout(() => {
2985
+ this.player.stop();
2986
+ this.previous_tone = null;
2987
+ }, duration * 1000);
2988
+ }
2989
+ play(tone, duration) {
2990
+ clearTimeout(this.stop_timer);
2991
+ if (this.previous_tone !== tone) {
2992
+ if (this.previous_tone)
2993
+ this.player.stop();
2994
+ this.player.play(tone, this.volume, "square");
2995
+ }
2996
+ this.previous_tone = tone;
2997
+ this.stop_timer = this.set_stop_timer(duration);
2998
+ }
2999
+ }
3000
+
3001
+ // src/lib/rk86_runner.ts
3002
+ class Runner {
3003
+ paused = false;
3004
+ tracer = null;
3005
+ last_instructions = [];
3006
+ previous_batch_time = 0;
3007
+ total_ticks = 0;
3008
+ last_iff_raise_ticks = 0;
3009
+ last_iff = 0;
3010
+ sound = null;
3011
+ instructions_per_millisecond = 0;
3012
+ ticks_per_millisecond = 0;
3013
+ FREQ = 1780000;
3014
+ TICK_PER_MS;
3015
+ execute_timer;
3016
+ machine;
3017
+ constructor(machine) {
3018
+ this.machine = machine;
3019
+ this.TICK_PER_MS = this.FREQ / 100;
3020
+ this.machine.io.interrupt = (iff) => this.interrupt(iff);
3021
+ this.machine.cpu.jump(63488);
3022
+ }
3023
+ interrupt(iff) {
3024
+ if (!this.sound)
3025
+ return;
3026
+ if (this.last_iff == iff)
3027
+ return;
3028
+ if (this.last_iff == 0 && iff == 1) {
3029
+ this.last_iff_raise_ticks = this.total_ticks;
3030
+ }
3031
+ if (this.last_iff == 1 && iff == 0) {
3032
+ const tone_ticks = this.total_ticks - this.last_iff_raise_ticks;
3033
+ const tone = this.FREQ / (tone_ticks * 2);
3034
+ const duration = 1 / tone;
3035
+ this.sound.play(tone, duration);
3036
+ }
3037
+ this.last_iff = iff;
3038
+ }
3039
+ init_sound(enabled) {
3040
+ if (enabled && this.sound == null) {
3041
+ this.sound = new Sound;
3042
+ console.log("\u0437\u0432\u0443\u043A \u0432\u043A\u043B\u044E\u0447\u0435\u043D");
3043
+ } else if (!enabled) {
3044
+ this.sound = null;
3045
+ console.log("\u0437\u0432\u0443\u043A \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D");
3046
+ }
3047
+ }
3048
+ execute() {
3049
+ clearTimeout(this.execute_timer);
3050
+ if (!this.paused) {
3051
+ let batch_ticks = 0;
3052
+ let batch_instructions = 0;
3053
+ while (batch_ticks < this.TICK_PER_MS) {
3054
+ if (this.tracer) {
3055
+ this.tracer("before");
3056
+ if (this.paused)
3057
+ break;
3058
+ }
3059
+ this.last_instructions.push(this.machine.cpu.pc);
3060
+ if (this.last_instructions.length > 5) {
3061
+ this.last_instructions.shift();
3062
+ }
3063
+ this.machine.memory.invalidate_access_variables();
3064
+ const instruction_ticks = this.machine.cpu.instruction();
3065
+ batch_ticks += instruction_ticks;
3066
+ this.total_ticks += instruction_ticks;
3067
+ if (this.tracer) {
3068
+ this.tracer("after");
3069
+ if (this.paused)
3070
+ break;
3071
+ }
3072
+ if (this.machine.ui.visualizer_visible && this.machine.ui.on_visualizer_hit) {
3073
+ this.machine.ui.on_visualizer_hit(this.machine.memory.read_raw(this.machine.cpu.pc));
3074
+ }
3075
+ batch_instructions += 1;
3076
+ }
3077
+ const now = performance.now();
3078
+ const elapsed = now - this.previous_batch_time;
3079
+ this.previous_batch_time = now;
3080
+ this.instructions_per_millisecond = batch_instructions / elapsed;
3081
+ this.ticks_per_millisecond = batch_ticks / elapsed;
3082
+ }
3083
+ this.execute_timer = setTimeout(() => this.execute(), 10);
3084
+ }
3085
+ pause() {
3086
+ this.paused = true;
3087
+ }
3088
+ resume() {
3089
+ this.paused = false;
3090
+ }
3091
+ reset() {
3092
+ this.machine.cpu.jump(63488);
3093
+ this.machine.keyboard.reset();
3094
+ }
3095
+ }
3096
+
3097
+ // src/lib/rk86_screen.ts
3098
+ class Screen {
3099
+ static #update_rate = 25;
3100
+ machine;
3101
+ cursor_rate;
3102
+ char_width;
3103
+ char_height;
3104
+ char_height_gap;
3105
+ cursor_width;
3106
+ cursor_height;
3107
+ scale_x;
3108
+ scale_y;
3109
+ width;
3110
+ height;
3111
+ cursor_state;
3112
+ cursor_x;
3113
+ cursor_y;
3114
+ last_cursor_state;
3115
+ last_cursor_x;
3116
+ last_cursor_y;
3117
+ font;
3118
+ light_pen_x;
3119
+ light_pen_y;
3120
+ light_pen_active;
3121
+ ctx;
3122
+ constructor(machine) {
3123
+ this.machine = machine;
3124
+ this.cursor_rate = 500;
3125
+ this.char_width = 6;
3126
+ this.char_height = 8;
3127
+ this.char_height_gap = 2;
3128
+ this.cursor_width = this.char_width;
3129
+ this.cursor_height = 1;
3130
+ this.scale_x = 1;
3131
+ this.scale_y = 1;
3132
+ this.width = 78;
3133
+ this.height = 30;
3134
+ this.cursor_state = false;
3135
+ this.cursor_x = 0;
3136
+ this.cursor_y = 0;
3137
+ this.last_cursor_state = false;
3138
+ this.last_cursor_x = 0;
3139
+ this.last_cursor_y = 0;
3140
+ this.font = new Image;
3141
+ this.font.src = this.machine.font;
3142
+ this.light_pen_x = 0;
3143
+ this.light_pen_y = 0;
3144
+ this.light_pen_active = 0;
3145
+ }
3146
+ export() {
3147
+ const h16 = (n) => "0x" + hex16(n);
3148
+ return {
3149
+ scale_x: this.scale_x,
3150
+ scale_y: this.scale_y,
3151
+ width: this.width,
3152
+ height: this.height,
3153
+ cursor_state: this.cursor_state ? 1 : 0,
3154
+ cursor_x: this.cursor_x,
3155
+ cursor_y: this.cursor_y,
3156
+ video_memory_base: h16(this.video_memory_base),
3157
+ video_memory_size: h16(this.video_memory_size),
3158
+ light_pen_x: this.light_pen_x,
3159
+ light_pen_y: this.light_pen_y,
3160
+ light_pen_active: this.light_pen_active
3161
+ };
3162
+ }
3163
+ import(snapshot) {
3164
+ const h = fromHex;
3165
+ this.scale_x = h(snapshot.scale_x);
3166
+ this.scale_y = h(snapshot.scale_y);
3167
+ this.width = h(snapshot.width);
3168
+ this.height = h(snapshot.height);
3169
+ this.cursor_state = h(snapshot.cursor_state) ? true : false;
3170
+ this.cursor_x = h(snapshot.cursor_x);
3171
+ this.cursor_y = h(snapshot.cursor_y);
3172
+ this.video_memory_base = h(snapshot.video_memory_base);
3173
+ this.video_memory_size = h(snapshot.video_memory_size);
3174
+ this.light_pen_x = h(snapshot.light_pen_x);
3175
+ this.light_pen_y = h(snapshot.light_pen_y);
3176
+ this.light_pen_active = h(snapshot.light_pen_active);
3177
+ }
3178
+ apply_import() {
3179
+ this.set_geometry(this.width, this.height);
3180
+ this.set_video_memory(this.video_memory_base);
3181
+ }
3182
+ start() {
3183
+ this.init();
3184
+ this.draw_screen();
3185
+ this.flip_cursor();
3186
+ this.machine.ui.canvas.onmousemove = this.handle_mousemove.bind(this);
3187
+ this.machine.ui.canvas.onmouseup = () => this.light_pen_active = 0;
3188
+ this.machine.ui.canvas.onmousedown = () => this.light_pen_active = 1;
3189
+ }
3190
+ cache = [];
3191
+ init_cache(sz) {
3192
+ for (let i = 0;i < sz; ++i)
3193
+ this.cache[i] = -1;
3194
+ }
3195
+ draw_char(x, y, ch) {
3196
+ this.ctx.drawImage(this.font, 2, this.char_height * ch, this.char_width, this.char_height, x * this.char_width * this.scale_x, y * (this.char_height + this.char_height_gap) * this.scale_y, this.char_width * this.scale_x, this.char_height * this.scale_y);
3197
+ }
3198
+ draw_cursor(x, y, visible) {
3199
+ const cy = (y2) => (y2 * (this.char_height + this.char_height_gap) + this.char_height) * this.scale_y;
3200
+ if (this.last_cursor_x !== x || this.last_cursor_y !== y) {
3201
+ if (this.last_cursor_state) {
3202
+ this.ctx.fillStyle = "#000000";
3203
+ this.ctx.fillRect(this.last_cursor_x * this.char_width * this.scale_x, cy(this.last_cursor_y), this.cursor_width * this.scale_x, this.cursor_height * this.scale_y);
3204
+ }
3205
+ this.last_cursor_state = this.cursor_state;
3206
+ this.last_cursor_x = x;
3207
+ this.last_cursor_y = y;
3208
+ }
3209
+ const cx = x * this.char_width * this.scale_x;
3210
+ this.ctx.fillStyle = visible ? "#ffffff" : "#000000";
3211
+ this.ctx.fillRect(cx, cy(y), this.cursor_width * this.scale_x, this.cursor_height * this.scale_y);
3212
+ }
3213
+ flip_cursor() {
3214
+ this.draw_cursor(this.cursor_x, this.cursor_y, this.cursor_state);
3215
+ this.cursor_state = !this.cursor_state;
3216
+ setTimeout(() => this.flip_cursor(), this.cursor_rate);
3217
+ }
3218
+ init() {
3219
+ this.ctx = this.machine.ui.canvas.getContext("2d");
3220
+ }
3221
+ disable_smoothing() {
3222
+ this.ctx.imageSmoothingEnabled = false;
3223
+ }
3224
+ last_width = 0;
3225
+ last_height = 0;
3226
+ video_memory_size = 0;
3227
+ set_geometry(width, height) {
3228
+ this.width = width;
3229
+ this.height = height;
3230
+ this.video_memory_size = width * height;
3231
+ this.machine.ui.update_screen_geometry(this.width, this.height);
3232
+ const canvas_width = this.width * this.char_width * this.scale_x;
3233
+ const canvas_height = this.height * (this.char_height + this.char_height_gap) * this.scale_y;
3234
+ this.machine.ui.resize_canvas(canvas_width, canvas_height);
3235
+ this.disable_smoothing();
3236
+ this.ctx.fillStyle = "#000000";
3237
+ this.ctx.fillRect(0, 0, canvas_width, canvas_height);
3238
+ if (this.last_width === this.width && this.last_height === this.height)
3239
+ return;
3240
+ 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}`);
3241
+ this.last_width = this.width;
3242
+ this.last_height = this.height;
3243
+ }
3244
+ video_memory_base = 0;
3245
+ last_video_memory_base = 0;
3246
+ set_video_memory(base) {
3247
+ this.video_memory_base = base;
3248
+ this.init_cache(this.video_memory_size);
3249
+ this.machine.ui.update_video_memory_address(this.video_memory_base);
3250
+ if (this.last_video_memory_base === this.video_memory_base)
3251
+ return;
3252
+ 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)}`);
3253
+ this.last_video_memory_base = this.video_memory_base;
3254
+ }
3255
+ set_cursor(x, y) {
3256
+ this.draw_cursor(this.cursor_x, this.cursor_y, false);
3257
+ this.cursor_x = x;
3258
+ this.cursor_y = y;
3259
+ }
3260
+ draw_screen() {
3261
+ const memory = this.machine.memory;
3262
+ let i = this.video_memory_base;
3263
+ for (let y = 0;y < this.height; ++y) {
3264
+ for (let x = 0;x < this.width; ++x) {
3265
+ const cache_i = i - this.video_memory_base;
3266
+ const ch = memory.read(i);
3267
+ if (this.cache[cache_i] !== ch) {
3268
+ this.draw_char(x, y, ch);
3269
+ this.cache[cache_i] = ch;
3270
+ }
3271
+ i += 1;
3272
+ }
3273
+ }
3274
+ setTimeout(() => this.draw_screen(), Screen.#update_rate);
3275
+ }
3276
+ handle_mousemove(event) {
3277
+ const canvas = this.machine.ui.canvas;
3278
+ const box = canvas.getBoundingClientRect();
3279
+ const scaleX = canvas.width / box.width;
3280
+ const scaleY = canvas.height / box.height;
3281
+ const mouseX = (event.clientX - box.left) * scaleX;
3282
+ const mouseY = (event.clientY - box.top) * scaleY;
3283
+ const x = Math.floor(mouseX / (this.char_width * this.scale_x));
3284
+ const y = Math.floor(mouseY / ((this.char_height + this.char_height_gap) * this.scale_y));
3285
+ this.light_pen_x = x;
3286
+ this.light_pen_y = y;
3287
+ }
3288
+ }
3289
+
3290
+ // src/lib/rk86_tape.ts
3291
+ class Tape {
3292
+ machine;
3293
+ previous_bit_ticks = 0;
3294
+ bit_started = false;
3295
+ bit_count = 0;
3296
+ current_byte = 0;
3297
+ written_bytes = [];
3298
+ written_bytes_from_e6 = 0;
3299
+ output_block_count = 0;
3300
+ output_timer = null;
3301
+ constructor(machine) {
3302
+ this.machine = machine;
3303
+ }
3304
+ save(bytes) {
3305
+ const binary = new Uint8Array(bytes);
3306
+ const blob = new Blob([binary], { type: "image/gif" });
3307
+ const filename = `rk86-tape-${this.output_block_count}.bin`;
3308
+ Tape.saveAs(blob, filename);
3309
+ this.output_block_count += 1;
3310
+ }
3311
+ log(bytes) {
3312
+ for (let i = 0;i < bytes.length; i += 16) {
3313
+ const line = bytes.slice(i, i + 16);
3314
+ console.log(i.toString(16).padStart(4, "0").toUpperCase() + ":", line.map((byte) => byte.toString(16).padStart(2, "0")).join(" "));
3315
+ }
3316
+ }
3317
+ write_ended = () => {
3318
+ this.bit_started = false;
3319
+ this.current_byte = 0;
3320
+ this.bit_count = 0;
3321
+ this.written_bytes = [];
3322
+ this.written_bytes_from_e6 = 0;
3323
+ const ui = this.machine.ui;
3324
+ ui.update_activity_indicator(false);
3325
+ ui.hightlight_written_bytes(false);
3326
+ };
3327
+ flush = () => {
3328
+ const sync_byte_index = this.written_bytes.findIndex((byte) => byte === 230);
3329
+ if (sync_byte_index === -1) {
3330
+ console.error("sync byte E6 is not found");
3331
+ this.log(this.written_bytes);
3332
+ } else {
3333
+ console.log(`${sync_byte_index} bytes before sync byte`);
3334
+ const bytes = this.written_bytes.slice(sync_byte_index);
3335
+ this.log(bytes);
3336
+ this.save(bytes);
3337
+ }
3338
+ this.write_ended();
3339
+ };
3340
+ write_bit = (bit) => {
3341
+ const runner_ticks = this.machine.runner.total_ticks;
3342
+ const time = runner_ticks - this.previous_bit_ticks;
3343
+ if (time > 1e4) {
3344
+ console.log("reset tape buffer due to timeout");
3345
+ this.write_ended();
3346
+ }
3347
+ if (!this.bit_started) {
3348
+ this.bit_started = true;
3349
+ } else {
3350
+ this.bit_started = false;
3351
+ this.current_byte |= (bit ? 128 : 0) >> this.bit_count;
3352
+ if (this.bit_count < 7) {
3353
+ this.bit_count += 1;
3354
+ } else {
3355
+ this.written_bytes.push(this.current_byte);
3356
+ if (this.current_byte === 230 || this.written_bytes_from_e6 > 0) {
3357
+ this.written_bytes_from_e6 += 1;
3358
+ }
3359
+ if (this.written_bytes.length === 1) {
3360
+ this.machine.ui.update_activity_indicator(true);
3361
+ this.machine.ui.update_written_bytes(0);
3362
+ }
3363
+ if (this.written_bytes_from_e6 === 1)
3364
+ this.machine.ui.hightlight_written_bytes(true);
3365
+ if (this.written_bytes_from_e6 > 0)
3366
+ this.machine.ui.update_written_bytes(this.written_bytes_from_e6);
3367
+ if (this.output_timer)
3368
+ clearTimeout(this.output_timer);
3369
+ this.output_timer = setTimeout(this.flush, 1000);
3370
+ this.current_byte = 0;
3371
+ this.bit_count = 0;
3372
+ }
3373
+ }
3374
+ this.previous_bit_ticks = runner_ticks;
3375
+ };
3376
+ static saveAs(blob, filename) {
3377
+ const url = URL.createObjectURL(blob);
3378
+ const a = document.createElement("a");
3379
+ a.href = url;
3380
+ a.download = filename;
3381
+ a.style.display = "none";
3382
+ document.body.appendChild(a);
3383
+ a.click();
3384
+ setTimeout(() => {
3385
+ document.body.removeChild(a);
3386
+ URL.revokeObjectURL(url);
3387
+ }, 100);
3388
+ }
3389
+ }
3390
+
3391
+ // src/lib/rk86_terminal.ts
3392
+ globalThis.Image = class {
3393
+ };
3394
+ var charMap = {
3395
+ 0: " ",
3396
+ 1: "\u2598",
3397
+ 2: "\u259D",
3398
+ 3: "\u2580",
3399
+ 4: "\u2597",
3400
+ 5: "\u259A",
3401
+ 6: "\u2590",
3402
+ 7: "\u259C",
3403
+ 8: " ",
3404
+ 9: "\u273F",
3405
+ 10: " ",
3406
+ 11: "\u2191",
3407
+ 12: " ",
3408
+ 13: " ",
3409
+ 14: "\u25C0",
3410
+ 15: "\u25BC",
3411
+ 16: "\u2596",
3412
+ 17: "\u258C",
3413
+ 18: "\u259E",
3414
+ 19: "\u259B",
3415
+ 20: "\u2584",
3416
+ 21: "\u2599",
3417
+ 22: "\u259F",
3418
+ 23: "\u2588",
3419
+ 24: " ",
3420
+ 25: " ",
3421
+ 26: " ",
3422
+ 27: "\u2502",
3423
+ 28: "\u2500",
3424
+ 29: "\u25B6",
3425
+ 30: "\u2310",
3426
+ 31: " ",
3427
+ 32: " ",
3428
+ 33: "!",
3429
+ 34: '"',
3430
+ 35: "#",
3431
+ 36: "$",
3432
+ 37: "%",
3433
+ 38: "&",
3434
+ 39: "'",
3435
+ 40: "(",
3436
+ 41: ")",
3437
+ 42: "*",
3438
+ 43: "+",
3439
+ 44: ",",
3440
+ 45: "-",
3441
+ 46: ".",
3442
+ 47: "/",
3443
+ 48: "0",
3444
+ 49: "1",
3445
+ 50: "2",
3446
+ 51: "3",
3447
+ 52: "4",
3448
+ 53: "5",
3449
+ 54: "6",
3450
+ 55: "7",
3451
+ 56: "8",
3452
+ 57: "9",
3453
+ 58: ":",
3454
+ 59: ";",
3455
+ 60: "<",
3456
+ 61: "=",
3457
+ 62: ">",
3458
+ 63: "?",
3459
+ 64: "@",
3460
+ 65: "A",
3461
+ 66: "B",
3462
+ 67: "C",
3463
+ 68: "D",
3464
+ 69: "E",
3465
+ 70: "F",
3466
+ 71: "G",
3467
+ 72: "H",
3468
+ 73: "I",
3469
+ 74: "J",
3470
+ 75: "K",
3471
+ 76: "L",
3472
+ 77: "M",
3473
+ 78: "N",
3474
+ 79: "O",
3475
+ 80: "P",
3476
+ 81: "Q",
3477
+ 82: "R",
3478
+ 83: "S",
3479
+ 84: "T",
3480
+ 85: "U",
3481
+ 86: "V",
3482
+ 87: "W",
3483
+ 88: "X",
3484
+ 89: "Y",
3485
+ 90: "Z",
3486
+ 91: "[",
3487
+ 92: "\\",
3488
+ 93: "]",
3489
+ 94: "^",
3490
+ 95: "_",
3491
+ 96: "\u042E",
3492
+ 97: "\u0410",
3493
+ 98: "\u0411",
3494
+ 99: "\u0426",
3495
+ 100: "\u0414",
3496
+ 101: "\u0415",
3497
+ 102: "\u0424",
3498
+ 103: "\u0413",
3499
+ 104: "\u0425",
3500
+ 105: "\u0418",
3501
+ 106: "\u0419",
3502
+ 107: "\u041A",
3503
+ 108: "\u041B",
3504
+ 109: "\u041C",
3505
+ 110: "\u041D",
3506
+ 111: "\u041E",
3507
+ 112: "\u041F",
3508
+ 113: "\u042F",
3509
+ 114: "\u0420",
3510
+ 115: "\u0421",
3511
+ 116: "\u0422",
3512
+ 117: "\u0423",
3513
+ 118: "\u0416",
3514
+ 119: "\u0412",
3515
+ 120: "\u042C",
3516
+ 121: "\u042B",
3517
+ 122: "\u0417",
3518
+ 123: "\u0428",
3519
+ 124: "\u042D",
3520
+ 125: "\u0429",
3521
+ 126: "\u0427",
3522
+ 127: "\u2588"
3523
+ };
3524
+ for (let i = 0;i < 128; i++)
3525
+ charMap[128 + i] = charMap[i];
3526
+ function rk86char(byte) {
3527
+ return charMap[byte & 255] ?? "\xB7";
3528
+ }
3529
+
3530
+ class TerminalUI {
3531
+ canvas = { getContext: () => null, width: 0, height: 0 };
3532
+ visualizer_visible = false;
3533
+ terminal = { put: () => {}, history: [] };
3534
+ i8080disasm;
3535
+ visualizer;
3536
+ toggle_assembler;
3537
+ on_visualizer_hit;
3538
+ on_pause_changed;
3539
+ refreshDebugger;
3540
+ resize_canvas() {}
3541
+ update_screen_geometry() {}
3542
+ update_video_memory_address() {}
3543
+ update_ruslat = () => {};
3544
+ update_activity_indicator = () => {};
3545
+ update_written_bytes = () => {};
3546
+ hightlight_written_bytes = () => {};
3547
+ start_update_perf = () => {};
3548
+ screenshot() {}
3549
+ memory_snapshot() {}
3550
+ emulator_snapshot() {}
3551
+ }
3552
+
3553
+ class IO {
3554
+ input = (_port) => 0;
3555
+ output = (_port, _w8) => {};
3556
+ interrupt = (_iff) => {};
3557
+ }
3558
+
3559
+ class TerminalScreen {
3560
+ machine;
3561
+ width = 78;
3562
+ height = 30;
3563
+ video_memory_base = 0;
3564
+ timer;
3565
+ constructor(machine) {
3566
+ this.machine = machine;
3567
+ }
3568
+ start() {
3569
+ this.render();
3570
+ }
3571
+ render() {
3572
+ const { memory, screen } = this.machine;
3573
+ const cursorX = screen.cursor_x;
3574
+ const cursorY = screen.cursor_y;
3575
+ const cursorVisible = screen.cursor_state;
3576
+ const dim = "\x1B[2m";
3577
+ const reset = "\x1B[0m";
3578
+ const w = this.width;
3579
+ let output = "\x1B[H";
3580
+ output += `${dim}\u250C${"\u2500".repeat(w)}\u2510${reset}
3581
+ `;
3582
+ let addr = this.video_memory_base;
3583
+ for (let y = 0;y < this.height; y++) {
3584
+ let line = `${dim}\u2502${reset}`;
3585
+ for (let x = 0;x < w; x++) {
3586
+ const ch = rk86char(memory.read(addr));
3587
+ if (x === cursorX && y === cursorY) {
3588
+ line += `\x1B[4m${ch}${reset}`;
3589
+ } else {
3590
+ line += ch;
3591
+ }
3592
+ addr++;
3593
+ }
3594
+ line += `${dim}\u2502${reset}`;
3595
+ output += line + `
3596
+ `;
3597
+ }
3598
+ output += `${dim}\u2514${"\u2500".repeat(w)}\u2518${reset}
3599
+ `;
3600
+ process.stdout.write(output);
3601
+ this.timer = setTimeout(() => this.render(), 40);
3602
+ }
3603
+ }
3604
+ var KEY_MAP = {
3605
+ a: "KeyA",
3606
+ b: "KeyB",
3607
+ c: "KeyC",
3608
+ d: "KeyD",
3609
+ e: "KeyE",
3610
+ f: "KeyF",
3611
+ g: "KeyG",
3612
+ h: "KeyH",
3613
+ i: "KeyI",
3614
+ j: "KeyJ",
3615
+ k: "KeyK",
3616
+ l: "KeyL",
3617
+ m: "KeyM",
3618
+ n: "KeyN",
3619
+ o: "KeyO",
3620
+ p: "KeyP",
3621
+ q: "KeyQ",
3622
+ r: "KeyR",
3623
+ s: "KeyS",
3624
+ t: "KeyT",
3625
+ u: "KeyU",
3626
+ v: "KeyV",
3627
+ w: "KeyW",
3628
+ x: "KeyX",
3629
+ y: "KeyY",
3630
+ z: "KeyZ",
3631
+ "0": "Digit0",
3632
+ "1": "Digit1",
3633
+ "2": "Digit2",
3634
+ "3": "Digit3",
3635
+ "4": "Digit4",
3636
+ "5": "Digit5",
3637
+ "6": "Digit6",
3638
+ "7": "Digit7",
3639
+ "8": "Digit8",
3640
+ "9": "Digit9",
3641
+ "\r": "Enter",
3642
+ "\n": "Enter",
3643
+ "\t": "Tab",
3644
+ "\x7F": "Backspace",
3645
+ "\b": "Backspace",
3646
+ " ": "Space",
3647
+ ",": "Comma",
3648
+ ".": "Period",
3649
+ "/": "Slash",
3650
+ ";": "Semicolon",
3651
+ "-": "Minus",
3652
+ "[": "BracketLeft",
3653
+ "]": "BracketRight",
3654
+ "\\": "Backslash",
3655
+ "`": "Backquote",
3656
+ "'": "Quote",
3657
+ "\x1B[A": "ArrowUp",
3658
+ "\x1B[B": "ArrowDown",
3659
+ "\x1B[C": "ArrowRight",
3660
+ "\x1B[D": "ArrowLeft",
3661
+ "\x1BOP": "F1",
3662
+ "\x1BOQ": "F2",
3663
+ "\x1BOR": "F3",
3664
+ "\x1BOS": "F4",
3665
+ "\x1B[15~": "F5",
3666
+ "\x1B[17~": "F6",
3667
+ "\x1B[18~": "F7",
3668
+ "\x1B[19~": "F8",
3669
+ "\x1B[20~": "F9",
3670
+ "\x1B[21~": "F10"
3671
+ };
3672
+ function setupKeyboard(keyboard) {
3673
+ if (!process.stdin.isTTY)
3674
+ return;
3675
+ process.stdin.setRawMode(true);
3676
+ process.stdin.resume();
3677
+ process.stdin.setEncoding("utf8");
3678
+ process.stdin.on("data", (data) => {
3679
+ if (data === "\x03") {
3680
+ process.stdout.write("\x1B[?25h");
3681
+ process.stdout.write("\x1B[2J\x1B[H");
3682
+ process.exit(0);
3683
+ }
3684
+ const code = KEY_MAP[data] || KEY_MAP[data.toLowerCase()];
3685
+ if (code) {
3686
+ if (data.length === 1 && data >= "A" && data <= "Z") {
3687
+ keyboard.onkeydown("ShiftLeft");
3688
+ }
3689
+ keyboard.onkeydown(code);
3690
+ setTimeout(() => {
3691
+ keyboard.onkeyup(code);
3692
+ if (data.length === 1 && data >= "A" && data <= "Z") {
3693
+ keyboard.onkeyup("ShiftLeft");
3694
+ }
3695
+ }, 50);
3696
+ }
3697
+ });
3698
+ }
3699
+ var MON32_B64 = "wzb4w2P+w5j7w7r8w0b8w7r8wwH+w6X8wyL5w3L+w3v6w3/6w7b6w0n7wxb7w876" + "w1L/w1b/PooyA4Axz3bNzvohAHYRX3YOAM3t+SHPdiIcdiFa/80i+c3O+iH/dSIx" + "diEqHSIvdj7DMiZ2Mc92IWb/zSL5MgKAPTICoM3u+CFs+OUhM3Z+/ljK0//+VcoA" + "8PXNLPkqK3ZNRCopdusqJ3bx/kTKxfn+Q8rX+f5Gyu35/lPK9Pn+VMr/+f5Nyib6" + "/kfKP/r+ScqG+v5Pyi37/kzKCPr+Uspo+sMA8D4zvcrx+OUhnv/NIvnhK8Pz+CEz" + "dgYAzWP+/gjK3Pj+f8rc+MS5/Hf+Dcoa+f4uymz4Bv8+Ur3Krvojw/P4eBcRM3YG" + "AMl+p8jNufwjwyL5ISd2ES12DgDN7fkRNHbNWvkiJ3YiKXbYPv8yLXbNWvkiKXbY" + "zVr5Iit22MOu+iEAABoT/g3Kjvn+LMj+IMpd+dYw+q76/gr6gvn+Efqu+v4X8q76" + "1gdPKSkpKdqu+gnDXfk3yXy6wH27yc2k+c2Q+cKi+TMzySPJzXL+/gPAzc76w676" + "5SFs/80i+eHJfsXNpfw+IM25/MHJzXj7zbn5zZb5feYPysX5w8j5Cr7K5vnNePvN" + "ufkKzbr5A82W+cPX+XHNmfnD7fl5vsx4+82W+cP0+X4CA82Z+cP/+c14+363+hX6" + "/iDSF/o+Ls25/M2W+X3mD8oI+sML+s14+825+eXN7vjh0jv65c1a+X3hdyPDJvrN" + "kPnKWvrrIiN2fjIldjb3PsMyMAAhov8iMQAxGHbB0eHx+SoWdsMmdj6QMgOgIgGg" + "OgCgAgPNmfnDbfoqAnbJ5SoAdn7hyTotdrfKkfp7Mi92zbb6zXj76814++vFzRb7" + "YGnNePvRzZD5yOvNePs+P825/MNs+D7/zf/65Qnrzf364Qnr5c0K+z7/zf/64eUh" + "AcA2ACs2TTYdNpk2kyM2J35+5iDK4fohCOA2gC4ENtA2diw2IzZJLgg2pOHJPgjN" + "mPtHPgjNmPtPyT4IzZj7d82Z+cMK+wEAAH6BT/XNkPnKn/nxeI5HzZn5wxn7ebfK" + "NfsyMHblzRb74c14++vNePvr5WBpzXj74cUBAADNRvwF4+PCTfsO5s1G/M2Q++vN" + "kPvrzYb7IQAAzZD7DubNRvzhzZD7w876xc2w+XzNpfx9zbr5wclOzUb8zZn5w4b7" + "TM1G/E3DRvzlxdVXPoAyCOAhAAA5MQAAIg12DgA6AoAPDw8P5gFf8XnmfwdPJgAl" + "yjT88ToCgA8PDw/mAbvKv/uxTxU6L3bC3PvWEkfxBcLd+xQ6AoAPDw8P5gFferf" + "yC/x5/ubC//uvMi52wwn8/hnCt/s+/zIudhYJFcK3+yEE4DbQNnYjNiM2ST4nMgH" + "APuAyAcAuCDakKg12+ToudqnDofwqDXb5zc76erfyrvrNpPnDnPvlxdX1PoAyCOAh" + "AAA5MQAAFgjxeQdPPgGpMgKAOjB2R/EFwmb8PgCpMgKAFTowdsJ6/NYOR/EFwnv8" + "FBXCWPz5IQTgNtA2diM2IzZJPicyAcA+4DIBwC4INqTx0cHhyfUPDw8Pza788eYP" + "/gr6t/zGB8YwT/XF1eXNAf4hhf3lKgJ26yoAdjoEdj367vzKZf3ic/151iBPDfrp/" + "MXNuf3Bw938rzIEdsl55n9P/h/Ko/3+DMqy/f4NyvP9/grKR/3+CMrW/f4Yyrn9/h" + "nK4v3+GsrF/f4byp79/gfCOP0B8AV4+z3CKP148z3CLv0Nwif9yXHNuf16/gPAe/" + "4IwM3i/Xr+G8LF/eXVIcJ3ERB4AZ4HGncjEwt5sMJY/dHhyXn+WcLp/M2y/T4C" + "w+r8edYgTw0+BPrq/MXNxf3Bw3f9IgB26yICdj6AMgHAfTIAwHwyAMDh0cHxyT4B" + "w+r8IfR/ESUJr3crG3uywqn9EQgDIcJ3yXsjHP5HwB4IAcD/CXr+GwFOAMLT/RYC" + "AbD4FAnJeysd/gjAHkcBQAAJev4DAbL/wvD9FhwBUAcVCcl9k9L5/SVvHggBCAAJ" + "yToCgOaAyg7+OgV2t8DlKgl2zXL+vW/KKv4+ATILdiYVryIJduEyBXbJJcIh/jzK" + "Iv48ylH+xQEDUM0n/cE6C3Ym4D0yC3bKTP4mQD7/wyL+OgKA5oDKUf46BnYvMgZ2" + "wxr+zQH+t8pj/q8yBXY6CXbJOgKA5oDCff4+/smvMgCAMgKAOgZ25gH2BjIDgDoB" + "gDzCl/49yeUuASYHfQ9vLzIAgDoBgC+3wrP+JfKc/j7/4ckuIDoBgC+3yq/+LcK1" + "/i4ILQfSw/58ZW/+Acr6/trz/gcHB8YgtP5fwgb/PiDhyQkKDX8IGRgaDB8bAAEC" + "AwQFfCHq/sP+/nwh4v6Fb37+QOHY5W86AoBn5kDCGv99/kD6P//mH+HJOgZ2t8oq" + "/33+QPoq//Ygb3zmIMI//33+QPo7/33uIOHJfeYvb33+QOHw5W/mD/4MffpQ/+4Q" + "4ckqMXbJIjF2yR9yYWRpby04NnJrAA0KLS0+AA0KGBgYGAANCiBQQy0NCiBITC0N" + "CiBCQy0NCiBERS0NCiBTUC0NCiBBRi0ZGRkZGRkACCAIACIWdvXhIh524SsiFHYh" + "AAA5MR525dXFKhR2Mc92zXj76yojds2Q+cJs+DoldnfDbPghc//NIvkhFHYGBl4j" + "VsXl6814+83u+NL2/81a+dHV63Irc+HBBSPC3v/J//8=";
3700
+ function decodeMon32() {
3701
+ return Array.from(new Uint8Array(Uint8Array.from(atob(MON32_B64), (c) => c.charCodeAt(0))));
3702
+ }
3703
+ async function fetchFile(name) {
3704
+ try {
3705
+ const data = await Bun.file(name).arrayBuffer();
3706
+ return Array.from(new Uint8Array(data));
3707
+ } catch {
3708
+ console.error(`\u043E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0444\u0430\u0439\u043B\u0430: ${name}`);
3709
+ }
3710
+ }
3711
+ function printHelp() {
3712
+ console.log(`\u042D\u043C\u0443\u043B\u044F\u0442\u043E\u0440 \u0420\u0430\u0434\u0438\u043E-86\u0420\u041A (\u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B)
3713
+
3714
+ \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: bun rk86.ts [\u043E\u043F\u0446\u0438\u0438] [\u0444\u0430\u0439\u043B]
3715
+
3716
+ \u041E\u043F\u0446\u0438\u0438:
3717
+ -h \u0441\u043F\u0440\u0430\u0432\u043A\u0430
3718
+ -l \u0441\u043F\u0438\u0441\u043E\u043A \u0444\u0430\u0439\u043B\u043E\u0432 \u0438\u0437 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430
3719
+ -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)
3720
+ -p \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0444\u0430\u0439\u043B \u0431\u0435\u0437 \u0437\u0430\u043F\u0443\u0441\u043A\u0430
3721
+
3722
+ \u041F\u0440\u0438\u043C\u0435\u0440\u044B:
3723
+ bun rk86.ts \u0437\u0430\u043F\u0443\u0441\u043A \u043C\u043E\u043D\u0438\u0442\u043E\u0440\u0430
3724
+ bun rk86.ts 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
3725
+ bun rk86.ts -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)
3726
+ bun rk86.ts -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
3727
+ bun rk86.ts -l \u0441\u043F\u0438\u0441\u043E\u043A \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0444\u0430\u0439\u043B\u043E\u0432
3728
+
3729
+ \u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435:
3730
+ Ctrl+C \u0432\u044B\u0445\u043E\u0434`);
3731
+ }
3732
+ function htmlToAnsi(html) {
3733
+ return html.replace(/<a\s+href="([^"]*)"[^>]*>(.*?)<\/a>/g, (_m, url, text) => `\x1B]8;;${url}\x1B\\${text}\x1B]8;;\x1B\\`).replace(/<[^>]*>/g, "").replace(/\n+/g, " ").trim();
3734
+ }
3735
+ async function listFiles() {
3736
+ const { catalog: catalog2 } = await Promise.resolve().then(() => (init_catalog_data(), exports_catalog_data));
3737
+ for (const entry of catalog2) {
3738
+ const title = htmlToAnsi(entry.title);
3739
+ const desc = entry.description ? ` \u2014 ${htmlToAnsi(entry.description)}` : "";
3740
+ console.log(`\x1B[33m${entry.name.padEnd(20)}\x1B[0m ${title}${desc}`);
3741
+ }
3742
+ }
3743
+ async function main() {
3744
+ const args = process.argv.slice(2);
3745
+ if (args.includes("-h") || args.includes("--help")) {
3746
+ printHelp();
3747
+ process.exit(0);
3748
+ }
3749
+ if (args.includes("-l") || args.includes("--list")) {
3750
+ await listFiles();
3751
+ process.exit(0);
3752
+ }
3753
+ const loadOnly = args.includes("-p");
3754
+ const monitorIdx = args.indexOf("-m");
3755
+ const monitorFile_ = monitorIdx >= 0 ? args[monitorIdx + 1] : undefined;
3756
+ const positional = args.filter((a, i) => !a.startsWith("-") && i !== monitorIdx + 1);
3757
+ const programFile = positional[0];
3758
+ const keyboard = new Keyboard;
3759
+ const io = new IO;
3760
+ const machineBuilder = {
3761
+ font: rk86_font_image(),
3762
+ keyboard,
3763
+ io
3764
+ };
3765
+ const machine = machineBuilder;
3766
+ machine.ui = new TerminalUI;
3767
+ machine.memory = new Memory(machine);
3768
+ machine.cpu = new I8080(machine);
3769
+ machine.screen = new Screen(machine);
3770
+ machine.tape = new Tape(machine);
3771
+ machine.runner = new Runner(machine);
3772
+ machine.memory.update_ruslat = machine.ui.update_ruslat;
3773
+ let monitorContent;
3774
+ if (monitorFile_) {
3775
+ const content = await fetchFile(monitorFile_);
3776
+ if (!content) {
3777
+ console.error(`\u043C\u043E\u043D\u0438\u0442\u043E\u0440 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D: ${monitorFile_}`);
3778
+ process.exit(1);
3779
+ }
3780
+ monitorContent = content;
3781
+ } else {
3782
+ monitorContent = decodeMon32();
3783
+ }
3784
+ const monitorFile = parse_rk86_binary(monitorFile_ || "mon32.bin", monitorContent);
3785
+ machine.memory.load_file(monitorFile);
3786
+ let entryPoint;
3787
+ if (programFile) {
3788
+ const content = await fetchFile(programFile);
3789
+ if (!content) {
3790
+ console.error(`\u0444\u0430\u0439\u043B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D: ${programFile}`);
3791
+ process.exit(1);
3792
+ }
3793
+ const file = parse_rk86_binary(programFile, content);
3794
+ machine.memory.load_file(file);
3795
+ entryPoint = file.entry;
3796
+ console.error(`\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D: ${programFile} (${file.start.toString(16)}-${file.end.toString(16)}, G${file.entry.toString(16)})`);
3797
+ }
3798
+ process.stdout.write("\x1B[?25l");
3799
+ process.stdout.write("\x1B[2J");
3800
+ setupKeyboard(keyboard);
3801
+ const termScreen = new TerminalScreen(machine);
3802
+ const origSetGeometry = machine.screen.set_geometry.bind(machine.screen);
3803
+ machine.screen.set_geometry = (width, height) => {
3804
+ origSetGeometry(width, height);
3805
+ termScreen.width = width;
3806
+ termScreen.height = height;
3807
+ };
3808
+ const origSetVideoMemory = machine.screen.set_video_memory.bind(machine.screen);
3809
+ machine.screen.set_video_memory = (base) => {
3810
+ origSetVideoMemory(base);
3811
+ termScreen.video_memory_base = base;
3812
+ };
3813
+ const noopCtx = {
3814
+ imageSmoothingEnabled: false,
3815
+ fillStyle: "",
3816
+ fillRect() {},
3817
+ drawImage() {},
3818
+ clearRect() {}
3819
+ };
3820
+ machine.screen.ctx = noopCtx;
3821
+ machine.screen.init = () => {
3822
+ machine.screen.ctx = noopCtx;
3823
+ };
3824
+ machine.screen.draw_screen = () => {};
3825
+ machine.screen.draw_cursor = () => {};
3826
+ machine.screen.start();
3827
+ machine.runner.execute();
3828
+ termScreen.start();
3829
+ if (entryPoint !== undefined && !loadOnly) {
3830
+ setTimeout(() => machine.cpu.jump(entryPoint), 500);
3831
+ }
3832
+ process.on("exit", () => {
3833
+ process.stdout.write("\x1B[?25h");
3834
+ });
3835
+ }
3836
+ main();