rk86 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/rk86.ts DELETED
@@ -1,3836 +0,0 @@
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();