Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Moderator: Shaos
-
begoon
- Maniac
- Posts: 256
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Определение работы в эмуляторе
Добавил подсветку синтакиса в визуальном ассемблере.
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: Определение работы в эмуляторе
Допилил еще один реально многолетний долгострой, который я еще и принципиально не хотел делать, ибо считал (да и все еще считаю), что ЙЦУКЕН - это то, как РК работает и точка
. Но, времена меняются.
-
Mondx
- Doomed
- Posts: 661
- Joined: 10 Aug 2022 07:27
- Location: Crimea
Re: Определение работы в эмуляторе
Почему то многие ставят указатель стека на верхушку какой то области ОЗУ, а не на верхушку + 1?
-
begoon
- Maniac
- Posts: 256
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Определение работы в эмуляторе
Веб-компонета эмулятора теперь на npmjs.com - https://www.npmjs.com/package/radio86-emulator
-
Shaos
- Admin
- Posts: 25067
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Это круто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
Очень давно можно. Там сверху две кнопки: выбор из каталога и выбор для прямого аплоада. А можно просто дропнуть файл в окно эмулятора.
-
Shaos
- Admin
- Posts: 25067
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Что прям в браузер?
-
begoon
- Maniac
- Posts: 256
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Как запускать программы эмуляторе - аж 4 способа:
-
begoon
- Maniac
- Posts: 256
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Переделал звук. Теперь работает вот так:
Плюс небольшой бонус: обновление видео теперь может работать в двух режимах: обычные requestAnimationFrame от браузера или частота, которую дали ВГ75. Особо визуальной разницы я пока не нашел в каких-то программах, но фича есть.
Плюс небольшой бонус: обновление видео теперь может работать в двух режимах: обычные requestAnimationFrame от браузера или частота, которую дали ВГ75. Особо визуальной разницы я пока не нашел в каких-то программах, но фича есть.
-
vital72
- Senior
- Posts: 195
- Joined: 17 Jun 2014 04:29
- Location: 93.80.157.217
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
если бы ещё авторство указал -- было бы совсем замечательно.
-
begoon
- Maniac
- Posts: 256
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
чье именно авторство и на что именно указать?
-
begoon
- Maniac
- Posts: 256
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Добавил в селектор выбора файла нужного формата при скачивании. Поддерживает основные ходовые форматы.
You do not have the required permissions to view the files attached to this post.
-
vital72
- Senior
- Posts: 195
- Joined: 17 Jun 2014 04:29
- Location: 93.80.157.217
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
реализация звука -- это полная копия моего кода.
я несколько недель бился над кодом, пока не достиг качественного звука, а тут приходит дядя и говорит "я сделал звук".
моё авторство надо указать.
-
begoon
- Maniac
- Posts: 256
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Я рад, что вы тоже читаете спецификации 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-секундного буфера белым шумом:
В 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-пример:
В sound.ts — дословно тот же конструкторный синтаксис и тот же способ планирования:
Смотрел ли я в ваш код? -- конечно. У вас интересный эмулятор, в котором много интересных решений типа:
- однопэмплового зацикленного DC-буфера как такового (в MDN буфер всегда содержит «настоящий» звук — шум, сэмпл, и т. п.)
- идеи «гейтить DC через GainNode для эмуляции 1-битного спикера»
- ресинка audio_time с currentTime по дрейфу
А еще постоянно смотрю в код Виктора Пыхонина, где не меньше знаний по РК и интересных инженерных решений.
А вот на тему вашего колхозного обращения "дядя", скажу, что если вдруг какая-то неуверенная в себе "тетя" придет и захочет взять мои исходники (полный проект открыт с самого начала), поставить там свое имя и выдать за свое -- be my guest. Время рассудит.
Что напрямую соответствует спецификации/примерам 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();
- буфер длиной 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
Самое главное-то забыл - https://github.com/begoon/rk86-js/commi ... 5bf1231d3e
You do not have the required permissions to view the files attached to this post.
