Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Советский компьютер Радио-86РК (1986) и его клоны

Moderator: Shaos

begoon
Maniac
Posts: 256
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Определение работы в эмуляторе

Post by begoon »

Добавил подсветку синтакиса в визуальном ассемблере.


rk86asm.png
You do not have the required permissions to view the files attached to this post.
begoon
Maniac
Posts: 256
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Определение работы в эмуляторе

Post by begoon »

Допилил еще один реально многолетний долгострой, который я еще и принципиально не хотел делать, ибо считал (да и все еще считаю), что ЙЦУКЕН - это то, как РК работает и точка :-). Но, времена меняются.

Mondx
Doomed
Posts: 661
Joined: 10 Aug 2022 07:27
Location: Crimea

Re: Определение работы в эмуляторе

Post by Mondx »

Почему то многие ставят указатель стека на верхушку какой то области ОЗУ, а не на верхушку + 1?
begoon
Maniac
Posts: 256
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Определение работы в эмуляторе

Post by begoon »

Веб-компонета эмулятора теперь на npmjs.com - https://www.npmjs.com/package/radio86-emulator
User avatar
Shaos
Admin
Posts: 25067
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by Shaos »

begoon wrote: 13 May 2026 10:58 Сделал явный выбор цветовой палитры в эмуляции: ч/б, толкалин, акименко и апогей.
Это круто :)
А туда можно свои бинари подгружать?
Или только через ассемблер?
begoon
Maniac
Posts: 256
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by begoon »

Очень давно можно. Там сверху две кнопки: выбор из каталога и выбор для прямого аплоада. А можно просто дропнуть файл в окно эмулятора.
User avatar
Shaos
Admin
Posts: 25067
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by Shaos »

begoon wrote: 17 May 2026 11:34 ...А можно просто дропнуть файл в окно эмулятора.
Что прям в браузер?
begoon
Maniac
Posts: 256
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by begoon »

Как запускать программы эмуляторе - аж 4 способа:

begoon
Maniac
Posts: 256
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by begoon »

Переделал звук. Теперь работает вот так:

Плюс небольшой бонус: обновление видео теперь может работать в двух режимах: обычные requestAnimationFrame от браузера или частота, которую дали ВГ75. Особо визуальной разницы я пока не нашел в каких-то программах, но фича есть.
User avatar
vital72
Senior
Posts: 195
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by vital72 »

если бы ещё авторство указал -- было бы совсем замечательно.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
begoon
Maniac
Posts: 256
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by begoon »

чье именно авторство и на что именно указать?
begoon
Maniac
Posts: 256
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by begoon »

Добавил в селектор выбора файла нужного формата при скачивании. Поддерживает основные ходовые форматы.
rk86selector-format.png
You do not have the required permissions to view the files attached to this post.
User avatar
vital72
Senior
Posts: 195
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by vital72 »

begoon wrote: 19 May 2026 02:47 чье именно авторство и на что именно указать?
реализация звука -- это полная копия моего кода.
я несколько недель бился над кодом, пока не достиг качественного звука, а тут приходит дядя и говорит "я сделал звук".
моё авторство надо указать.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
begoon
Maniac
Posts: 256
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by begoon »

Я рад, что вы тоже читаете спецификации Web Audio, и частности, примеры.

Что напрямую соответствует спецификации/примерам MDN:

- gain.gain.setValueAtTime(value, time) — это канонический пример AudioParam из спецификации W3C Web Audio API (§AudioParam) и со страницы setValueAtTime на MDN. Планирование точных по сэмплу изменений параметров в координатах AudioContext.currentTime — ровно тот паттерн, который демонстрирует спецификация.

- new GainNode(ctx, {gain: 0}) + connect(destination) — прямо из примеров «Modular Routing» в спецификации.
- Возобновление приостановленного контекста — соответствует паттерну «AudioContext.resume() после жеста пользователя», описанному в рекомендациях W3C по autoplay и в примере AudioContext.state на MDN.

Трюк «однопэмпловый буфер со значением 1.0, зацикленный, прогнанный через GainNode» — это широко известный прием для получения DC-источника, который можно гейтить. Спецификация W3C это не показывает; современный аналог — это ConstantSourceNode (добавлен в Web Audio API именно под этот сценарий: выдавать постоянный сигнал, гейтить/модулировать его через AudioParam offset).

"Узнаваемые куски" — это ровно те же идиомы, что показаны в двух примерах MDN:

1. audio-buffer/index.html — паттерн createBuffer + getChannelData(0) = …

В MDN-примере это используется для заполнения 2-секундного буфера белым шумом:

Code: Select all

  const buffer = new AudioBuffer({ numberOfChannels, length: frameCount, sampleRate });
  const nowBuffering = buffer.getChannelData(channel);
  for (let i = 0; i < frameCount; i++) nowBuffering[i] = Math.random() * 2 - 1;
  const source = audioCtx.createBufferSource();
  source.buffer = buffer;
  source.connect(audioCtx.destination);
  source.start();
В sound.ts та же последовательность вызовов, только:

- буфер длиной 1 сэмпл, а не sampleRate * 2,
- в него записывается одна константа 1.0 вместо цикла со случайными значениями,
- источник зацикливается (loop: true) и идёт через GainNode, а не напрямую в destination.

Так что buffer.getChannelData(0)[0] = 1.0; — это минимизированный до одного сэмпла вариант MDN-идиомы из audio-buffer, превращающий «буфер с данными» в DC-источник.

2. audio-param/index.html — паттерн new GainNode(ctx, {gain: …}) + gainNode.gain.setValueAtTime(...)

MDN-пример:

Code: Select all

  const gainNode = new GainNode(audioCtx, { gain: 0.5 });
  source.connect(gainNode);
  gainNode.connect(audioCtx.destination);
  gainNode.gain.setValueAtTime(currGain, audioCtx.currentTime + 1);

В sound.ts — дословно тот же конструкторный синтаксис и тот же способ планирования:

Code: Select all

  this.gain = new GainNode(this.audioCtx, { gain: 0 });
  this.gain.connect(this.audioCtx.destination);
  this.gain.gain.setValueAtTime(level ? ON_GAIN : 0, this.when(cpu_ticks));
Смотрел ли я в ваш код? -- конечно. У вас интересный эмулятор, в котором много интересных решений типа:

- однопэмплового зацикленного DC-буфера как такового (в MDN буфер всегда содержит «настоящий» звук — шум, сэмпл, и т. п.)
- идеи «гейтить DC через GainNode для эмуляции 1-битного спикера»
- ресинка audio_time с currentTime по дрейфу

А еще постоянно смотрю в код Виктора Пыхонина, где не меньше знаний по РК и интересных инженерных решений.

А вот на тему вашего колхозного обращения "дядя", скажу, что если вдруг какая-то неуверенная в себе "тетя" придет и захочет взять мои исходники (полный проект открыт с самого начала), поставить там свое имя и выдать за свое -- be my guest. Время рассудит.
begoon
Maniac
Posts: 256
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript

Post by begoon »

Самое главное-то забыл - https://github.com/begoon/rk86-js/commi ... 5bf1231d3e
sound.png
You do not have the required permissions to view the files attached to this post.