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

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

Moderator: Shaos

User avatar
alexcp
Maniac
Posts: 200
Joined: 11 Jun 2012 07:30

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

Post by alexcp »

Благодарю! Все работает!
begoon
Maniac
Posts: 293
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

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

Post by begoon »

alexcp wrote: 21 Jun 2026 05:45 Все работает!
А что именно ты думаешь добавить в память с e000?

Что если сделать универсальный интерфейс для загрузки и выгрузки памяти РК по USB?

Объясню. Я, например, хотел бы иметь реальный ванильный РК, по полной классике, но на SRAM (например, как твой оригинальный SRAM РК, что ты мне отдал, где в допПЗУ был бейсик).

Но! Мне б не хотелось возиться с программатором, переставлять микросхемы и пр. Что если оборудовать 100% ванильный РК по схемотехнике рядом стоящим USB-доступом в память.

РК будет работать как обычно, и не будет ничего знать о USB соседе. Сосед же, например, что-то на микроконтроллере, будет иметь возможность полностью останавливать процессор и загружать или выгружать блоки памяти через USB. Остановка не будет портить память, ибо SRAM.

USB со стороны компьютера будет, например, терминал с каким-то командами для загрузки и выгрузки памяти.

В итоге, мы будем иметь 100% ванильный родной РК, но без необходимости ленты или ее эмуляции, перепрограммирования ПЗУ и пр. Все, что будет нужно - это любой комп рядом с USB, с которого можно тривиально и очень быстро запускать программы.

Надеюсь, мысль донес.
Damir
Senior
Posts: 110
Joined: 21 Feb 2017 06:54
Location: Казань

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

Post by Damir »

begoon wrote: 20 Jun 2026 22:44 Забыл добавить: кнопка "upload" в моем ассемблере загружает результат ассемблирования в эмулятор без запуска, чтобы не нужно было постоянно через точку останова останавливать запуск.
ВО !!! Спасибо за класический вариант ! Попробовал -работает.
Но к новому я тоже успел привыкнуть ! Правда у меня WIN7 и все преимущества по сохранению состояния не работают, приходилось каждый раз кнопкой upload загружать и менять цвет на dark тоже - это тоже не сохраняеться. я про это и не знал, пока в 10-ке не запустил на ноуте - там красота, все сохраняется и сразу можно начинать!! Поэтому кнопку upload хорошо бы оставить., а для загрузки кода в эмулятор добавить новую кнопку ?
begoon
Maniac
Posts: 293
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

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

Post by begoon »

Сделаем.
begoon
Maniac
Posts: 293
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

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

Post by begoon »

Теперь есть и load (для загрузки в эмулятор) и upload (для загрузки в редактор) кнопки.
load.png
You do not have the required permissions to view the files attached to this post.
Damir
Senior
Posts: 110
Joined: 21 Feb 2017 06:54
Location: Казань

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

Post by Damir »

begoon wrote: 22 Jun 2026 02:43 Теперь есть и load (для загрузки в эмулятор) и upload (для загрузки в редактор) кнопки.
ОК! Спасибо. проверил - работает !!
User avatar
alexcp
Maniac
Posts: 200
Joined: 11 Jun 2012 07:30

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

Post by alexcp »

begoon wrote: 22 Jun 2026 02:17 А что именно ты думаешь добавить в память с e000?
Что если сделать универсальный интерфейс для загрузки и выгрузки памяти РК по USB?
И это тоже. Я недавно играл с micro:bit. Когда его подключаешь по USB, для настольной ОС он выглядит как USB drive. В него можно скопировать .hex файл, и этот файл начинает выполняться. на micro:bit. Если есть WebUSB (например, в Chrome), то даже файл не нужен - можно прямо в браузере нажать кнопку и перепрограммировать micro:bit. Удобно.

Для РК кмк есть несколько вариантов разной степени сложности и полезности. Самый простой для ванильного РК - это эмуляция все того же магнитофона. Настольная среда разработки общается с РК по аудио каналу, РК пользуется Монитором для загрузки-выгрузки. Большой плюс - РК не требуется менять. Минус - медленно, неудобно, при выгрузке из РК нужно думать об адресах. Так много кто делал, в том числе и я.

Второй - добавить в РК новый интерфейс, который в РК будет занимать несколько адресов в памяти, а со стороны USB выглядеть как (быстрый) последовательный порт. Я так тоже делал, на FT245R. Поскольку памяти в РК немного, получается быстро, скорости последовательного порта хватает. Для РК нужно будет дописать код. Я тогда адаптировал для РК монитор от отладчика NoICE, но можно написать какой-нибудь XMODEM или еще чего-то, по вкусу.

Третий - сделать подобие того же micro:bit, добавив в РК модуль на микроконтроллере c USB, который будет, к примеру, приостанавливать процессор РК и читать и записывать ОЗУ и ПЗУ. (Запись в ПЗУ потребует доп. модификаций из-за все того же ВТ57). Это выглядит довольно сложно - много кода и железа - хотя, конечно, не невозможно.

Четвертый - добавить в РК возможность читать и писать файлы на USB флешке путем добавления модуля на каком-нибудь CH376S. Это немного похоже на недавний вариант РК с CompactFlash, но без вымирающих CompactFlash карт и без ограничений, связанных с реализацией FAT на РК. Для РК придется написать подобие ОС.
User avatar
Shaos
Admin
Posts: 25284
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Перенёс сообщение про РК в Протэусе в соответствующий топик: viewtopic.php?t=16296&start=60
User avatar
alexcp
Maniac
Posts: 200
Joined: 11 Jun 2012 07:30

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

Post by alexcp »

Вопрос к @begoon: чтобы использовать форк твоего эмулятора для РК-подобной машинки с другим распределением верхних 32Кб (мне нужно больше ПЗУ, и я хочу сократить и передвинуть блоки памяти, выделенные под ввод-вывод), достаточно ли отредактировать src/lib/core/rk86_memory.ts?
begoon
Maniac
Posts: 293
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

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

Post by begoon »

Почти.

Дешифратор адресов и все регистры периферии живут в одном файле, а вот адрес старта и адрес загрузки монитора зашиты ещё в нескольких местах.

Что действительно сосредоточено в src/lib/core/rk86_memory.ts

- Дешифратор по A13–A15 задан масками 0xE003 (ВВ55), 0xE001 (ВГ75), 0xE00F (ВТ57) в read() и write(). Если у новой машины иная дешифрация, например по A12–A15, меняются маски и константы сравнения, а не логика обработчиков.
- Граница ОЗУ/ПЗУ на запись — проверка addr < 0xe000 в write() (rk86_memory.ts:210). На чтение E000–FFFF просто отдаёт buf, так что ПЗУ любого размера получается сдвигом этой границы.
- zero_ram() чистит только 0000–7FFF (rk86_memory.ts:92). При другом объёме ОЗУ подправить.

Что зашито снаружи и потребует правки

- Адрес старта cpu.jump(0xf800) продублирован в пяти местах: rk86_runner.ts:58 и :222, boot.ts:73 и :509, radio86-emulator.ts:211. Если вход в ваш монитор не F800, менять все.
- Адрес загрузки ПЗУ: rk86_file_parser.ts:83 кладёт файлы с именем mon* в 0x10000 - size, то есть прижимает к FFFF. Для 8 КБ монитора это само даст E000–FFFF. Если ПЗУ должно лежать иначе, нужен тег !start= в hex-dump формате или правка парсера.
- Порты IN/OUT отображаются на память как port | port << 8 (boot.ts:377, radio86-emulator.ts:142, rk86_terminal.ts:751). Правок не требует, но стоит учесть, что порты идут через тот же дешифратор.
- Косметика: MemoryMap.svelte:19, дефолт --exit-address 0xFFFE в терминале, таблица карты памяти в info/RK86.md.

На что обратить внимание

- Рендерер и терминал читают видеопамять через memory.read(), то есть через дешифратор. Видеопамять не должна попадать в диапазон, который вы отведёте под ввод-вывод, иначе на экране окажутся значения регистров.
- Запуск программ через runLoadedFile эмулирует ввод команды G<addr> с клавиатуры. От карты памяти это не зависит, но требует RK-совместимого монитора с командой G.
- E2E-тесты в tests/rk86_terminal_e2e.test.ts сравнивают снимки экрана с эталонами, снятыми на mon32.bin. С другим монитором эталоны придётся перегенерировать.
User avatar
alexcp
Maniac
Posts: 200
Joined: 11 Jun 2012 07:30

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

Post by alexcp »

Прекрасно, спасибо! Попробую поиграться.
begoon
Maniac
Posts: 293
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

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

Post by begoon »

У меня была мысль поддержать переключаемые профайлы, ну до какой-то степени.

Если у тебя там не шибко сильная девиация, я могу попробовать.
begoon
Maniac
Posts: 293
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

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

Post by begoon »

Типа json'чика, которые будет задавать параметры системы. Надо б его как сделать, что постепенно расшивать можно было по вариативности.
User avatar
alexcp
Maniac
Posts: 200
Joined: 11 Jun 2012 07:30

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

Post by alexcp »

Это пока на уровне идей - нет ни железки, ни кода - но было бы здОрово.

Для РК-совместимости я бы сохранил ОЗУ в начале адресного пространства (всегда с 0x0000), а ПЗУ - в конце (прижал бы к 0x10000, как собственно, и сделано), а между ними добавил бы устройства ввода-вывода. Например, что-то вроде:

Code: Select all

type MachineProfile = {
    ramEnd: number;
    romStart: number;

    keyboardPpiBase: number;
    crtcBase: number;
    dmaBase: number;
};
и затем

Code: Select all

const RK86_CLASSIC = {...};
const RK86_NEW = {...};
Точку входа в Монитор (0xF800) и его команды (G и проч.) можно оставить теми же для совместимости.

Тогда становится тривиальной реализация, например, Микроши, а также других вариаций на тему РК.
begoon
Maniac
Posts: 293
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

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

Post by begoon »

Запилил Профили оборудования по твоему предложению.

Надеюсь, ничего не поломал 😁
profiles.png
You do not have the required permissions to view the files attached to this post.