Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Moderator: Shaos
-
begoon
- Maniac
- Posts: 219
- 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.
-
begoon
- Maniac
- Posts: 219
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Добавил Сквош
Благодаря этой игры выловил аж 3 (!) фундаментальных бага в эмуляторе, которые были в нем все эти годы.
VG75: специальные управляющие символы 0xF0..0xFF (End of Row / End of Frame)
В микросхеме i8275 (К580ВГ75) старший hex-блок 0xF0..0xFF
зарезервирован под специальные управляющие коды (Special Control
Characters). Эти байты не рисуются как глифы — VG75 их
интерпретирует как команды управления выводом:
- 0xF0..0xF7 — End of Row: оборвать текущую строку. VG75 не рисует
ни байт-команду, ни оставшиеся столбцы строки. Подварианты
отличаются атрибутами и наличием Stop-DMA.
- 0xF8..0xFF — End of Frame / End of Screen: оборвать текущую
строку и все последующие. Применяется для динамической
обрезки кадра.
В РК86 это широко используется для аккуратного обрезания строки
до меньшей ширины, чем запрограммированные 78 столбцов VG75.
IK57: повторное программирование канала через flip-flop первого/второго байта
В микросхеме i8257 (КР580ВТ57, она же ИК57) каждый из адресных
регистров каналов 16-битный, но обращение к нему идёт через 8-битные
порты. Внутренний flip-flop (F/F) определяет, в какую половину
попадёт следующая запись — в младшую или старшую. F/F сбрасывается
командой master-clear (E008 = 0x80) и переключается при каждой
записи в адресный регистр канала.
Старая реализация распознавала только начальную последовательность
инициализации:
E008,80 → E004,lo → E004,hi → E005,lo → E005,hi → E008,A4.
Любая последующая прямая запись в E004/E005 без повторного
master-clear считалась случайной и просто складывалась в RAM, не
оказывая влияния на DMA. Программы, которые после инициализации
перепрограммируют адрес видеопамяти на лету, не получали ожидаемого
эффекта: DMA продолжал читать кадр со старого адреса, и игровое
поле рисовалось в одну область памяти, а на экран отображалась
другая.
VG75: корректный сигнал VRTC в регистре состояния 0xC001
Чтение регистра состояния VG75 по адресу 0xC001 всегда возвращало
константу 0x20 — то есть бит 5 (VRTC, vertical retrace) был
постоянно поднят. Программы, использующие классическую идиому
ожидания вертикальной синхронизации (LXI H,C001 / MOV A,M / ANI 20 /
JZ), выходили из цикла ожидания мгновенно: кадровая синхронизация
полностью игнорировалась, и эмулируемая программа выполняла своё
тело кадра на максимальной скорости процессора, без покадровой
паузы.
Симптом, на котором это поймалось: игра Squash от Дмитрия Иванова
(2024). Полный цикл «splash → запуск игры → потеря 3 жизней → game
over → splash» проходил за ~35 мс CPU-времени — ниже порога
восприятия, экран не успевал ни обновиться, ни прокачать DMA, и
визуально это выглядело как «пробел не работает».
Благодаря этой игры выловил аж 3 (!) фундаментальных бага в эмуляторе, которые были в нем все эти годы.
VG75: специальные управляющие символы 0xF0..0xFF (End of Row / End of Frame)
В микросхеме i8275 (К580ВГ75) старший hex-блок 0xF0..0xFF
зарезервирован под специальные управляющие коды (Special Control
Characters). Эти байты не рисуются как глифы — VG75 их
интерпретирует как команды управления выводом:
- 0xF0..0xF7 — End of Row: оборвать текущую строку. VG75 не рисует
ни байт-команду, ни оставшиеся столбцы строки. Подварианты
отличаются атрибутами и наличием Stop-DMA.
- 0xF8..0xFF — End of Frame / End of Screen: оборвать текущую
строку и все последующие. Применяется для динамической
обрезки кадра.
В РК86 это широко используется для аккуратного обрезания строки
до меньшей ширины, чем запрограммированные 78 столбцов VG75.
IK57: повторное программирование канала через flip-flop первого/второго байта
В микросхеме i8257 (КР580ВТ57, она же ИК57) каждый из адресных
регистров каналов 16-битный, но обращение к нему идёт через 8-битные
порты. Внутренний flip-flop (F/F) определяет, в какую половину
попадёт следующая запись — в младшую или старшую. F/F сбрасывается
командой master-clear (E008 = 0x80) и переключается при каждой
записи в адресный регистр канала.
Старая реализация распознавала только начальную последовательность
инициализации:
E008,80 → E004,lo → E004,hi → E005,lo → E005,hi → E008,A4.
Любая последующая прямая запись в E004/E005 без повторного
master-clear считалась случайной и просто складывалась в RAM, не
оказывая влияния на DMA. Программы, которые после инициализации
перепрограммируют адрес видеопамяти на лету, не получали ожидаемого
эффекта: DMA продолжал читать кадр со старого адреса, и игровое
поле рисовалось в одну область памяти, а на экран отображалась
другая.
VG75: корректный сигнал VRTC в регистре состояния 0xC001
Чтение регистра состояния VG75 по адресу 0xC001 всегда возвращало
константу 0x20 — то есть бит 5 (VRTC, vertical retrace) был
постоянно поднят. Программы, использующие классическую идиому
ожидания вертикальной синхронизации (LXI H,C001 / MOV A,M / ANI 20 /
JZ), выходили из цикла ожидания мгновенно: кадровая синхронизация
полностью игнорировалась, и эмулируемая программа выполняла своё
тело кадра на максимальной скорости процессора, без покадровой
паузы.
Симптом, на котором это поймалось: игра Squash от Дмитрия Иванова
(2024). Полный цикл «splash → запуск игры → потеря 3 жизней → game
over → splash» проходил за ~35 мс CPU-времени — ниже порога
восприятия, экран не успевал ни обновиться, ни прокачать DMA, и
визуально это выглядело как «пробел не работает».
You do not have the required permissions to view the files attached to this post.
Last edited by begoon on 09 May 2026 10:15, edited 2 times in total.
-
begoon
- Maniac
- Posts: 219
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Добавил Dizzy
Игруха реально шедевр.
Кому лень рубиться самому - вот стрим, где человек реально прошел всю игру.
Игруха реально шедевр.
Кому лень рубиться самому - вот стрим, где человек реально прошел всю игру.
You do not have the required permissions to view the files attached to this post.
Last edited by begoon on 09 May 2026 10:16, edited 1 time in total.
-
begoon
- Maniac
- Posts: 219
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Добавил Trex
You do not have the required permissions to view the files attached to this post.
-
begoon
- Maniac
- Posts: 219
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Добавил Weird
You do not have the required permissions to view the files attached to this post.
-
begoon
- Maniac
- Posts: 219
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Эмуляторы I8080/КР580ВМ80A и Радио-86РК на JavaScript
Добавил drag-and-drop в браузер эмулятора, чтоб быстрее запускать.
Как альтернатива "bunx rk86 --online squash.rkr".
Как альтернатива "bunx rk86 --online squash.rkr".
