<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://emuverse.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%AE%D0%BD%D0%B8%D0%BE%D1%80_%D0%A4%D0%92-6506%2F%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F</id>
	<title>Юниор ФВ-6506/Техническая информация - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://emuverse.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%AE%D0%BD%D0%B8%D0%BE%D1%80_%D0%A4%D0%92-6506%2F%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F"/>
	<link rel="alternate" type="text/html" href="https://emuverse.ru/w/index.php?title=%D0%AE%D0%BD%D0%B8%D0%BE%D1%80_%D0%A4%D0%92-6506/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F&amp;action=history"/>
	<updated>2026-09-26T05:07:26Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://emuverse.ru/w/index.php?title=%D0%AE%D0%BD%D0%B8%D0%BE%D1%80_%D0%A4%D0%92-6506/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=4304&amp;oldid=prev</id>
		<title>Panther: Новая страница: «{{Emuverse}}  Материал собран при написании эмулятора Юниора для eCat3 (2026). Всё, что здесь написано, снято с ПЗУ монитора, с сохранившихся образов лент и с поведения самой системы TCP/M; там, где что-то принято на веру или выведено косвенно, это сказано прямо.  Схема...»</title>
		<link rel="alternate" type="text/html" href="https://emuverse.ru/w/index.php?title=%D0%AE%D0%BD%D0%B8%D0%BE%D1%80_%D0%A4%D0%92-6506/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=4304&amp;oldid=prev"/>
		<updated>2026-09-25T17:31:16Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «{{Emuverse}}  Материал собран при написании эмулятора Юниора для eCat3 (2026). Всё, что здесь написано, снято с ПЗУ монитора, с сохранившихся образов лент и с поведения самой системы TCP/M; там, где что-то принято на веру или выведено косвенно, это сказано прямо.  Схема...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Emuverse}}&lt;br /&gt;
&lt;br /&gt;
Материал собран при написании эмулятора Юниора для eCat3 (2026). Всё, что здесь&lt;br /&gt;
написано, снято с ПЗУ монитора, с сохранившихся образов лент и с поведения самой&lt;br /&gt;
системы TCP/M; там, где что-то принято на веру или выведено косвенно, это сказано&lt;br /&gt;
прямо.&lt;br /&gt;
&lt;br /&gt;
Схема Юниора сохранилась, и это сильно отличает его от [[Арго ФВ-6511|Арго]] —&lt;br /&gt;
родственной машины, про которую почти всё приходилось выводить из поведения.&lt;br /&gt;
&lt;br /&gt;
== Коротко о машине ==&lt;br /&gt;
&lt;br /&gt;
Киевская разработка 1989–1991 годов, выпускалась заводом управляющих вычислительных&lt;br /&gt;
машин, затем объединением «Электроприбор». Формально — развитие [[Радио 86РК]], но от&lt;br /&gt;
прототипа осталась только идея:&lt;br /&gt;
&lt;br /&gt;
* КР580ВМ80А на 2.2 МГц;&lt;br /&gt;
* 128 Кбайт ОЗУ, плюс расширение блоками по 64 Кбайт (в полной комплектации семь блоков, 512 Кбайт);&lt;br /&gt;
* экран 80×25 с цветом на [[КР580ВГ75]], знакоместо 6×10;&lt;br /&gt;
* второй знакогенератор и графический режим 80×64 знакоместа по 6×4 точки (240×128 псевдопикселей), переключается разрядом 3 порта C;&lt;br /&gt;
* строчные буквы;&lt;br /&gt;
* звук на КР580ВИ53;&lt;br /&gt;
* клавиатура на 88 клавиш, матрица 11×8 через дешифратор К555ИД3;&lt;br /&gt;
* всё периферийное вынесено в пространство портов.&lt;br /&gt;
&lt;br /&gt;
Штатная система — &amp;#039;&amp;#039;&amp;#039;TCP/M-80М&amp;#039;&amp;#039;&amp;#039;: CP/M, у которой вместо дисковода магнитофон.&lt;br /&gt;
&lt;br /&gt;
== Лента как накопитель ==&lt;br /&gt;
&lt;br /&gt;
Это главная особенность машины и главное, что стоило разобрать.&lt;br /&gt;
&lt;br /&gt;
Лента у Юниора &amp;#039;&amp;#039;&amp;#039;не звуковая дорожка, а накопитель&amp;#039;&amp;#039;&amp;#039;. ОС обращается с кассетой как&lt;br /&gt;
с диском, а лентопротяжку («Маяк-231» и более поздние) компьютер перематывает сам&lt;br /&gt;
по разъёму дистанционного управления. Обмен идёт &amp;#039;&amp;#039;&amp;#039;байтами&amp;#039;&amp;#039;&amp;#039; через КР580ВВ51 в&lt;br /&gt;
синхронном режиме: модуляция аппаратная, а не программная, как у РК-86.&lt;br /&gt;
&lt;br /&gt;
Скорость — 2400 бод, то есть 300 байт в секунду. Сектор в 2 Кбайта проходит головку&lt;br /&gt;
около семи секунд, и загрузка системы занимает минуты.&lt;br /&gt;
&lt;br /&gt;
=== Как лента размечена ===&lt;br /&gt;
&lt;br /&gt;
Кассета размечена парами «маркер — блок»:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[32 байта маркера][~48 мс][2057 байт данных][~2.9 с][следующий маркер]...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В маркере, кроме синхросимвола и контрольной суммы, лежат &amp;#039;&amp;#039;&amp;#039;номер блока&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(16 разрядов, младший байт вперёд) и &amp;#039;&amp;#039;&amp;#039;метка кассеты&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Ни скорость воспроизведения, ни скорость перемотки конкретного магнитофона машине&lt;br /&gt;
не известны, и знать их не нужно: &amp;#039;&amp;#039;&amp;#039;где головка, написано на самой ленте&amp;#039;&amp;#039;&amp;#039;. Поиск&lt;br /&gt;
блока — это чтение маркеров подряд со сравнением номера. Загрузчик так и делает:&lt;br /&gt;
сравнение по адресу +4 в буфере маркера, «меньше» — проскочили, «не равно» — читаем&lt;br /&gt;
следующий.&lt;br /&gt;
&lt;br /&gt;
Метка кассеты отвечает на второй вопрос — та ли это лента. Если системе нужен&lt;br /&gt;
другой том, она печатает «Установите любую кассету, но не CII. A» и ждёт пробела.&lt;br /&gt;
&lt;br /&gt;
Что делает лентопротяжка, видно в верхней строке экрана: драйвер пишет туда&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;WR&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Перемотка ===&lt;br /&gt;
&lt;br /&gt;
Перемотка — только способ сэкономить время, и она &amp;#039;&amp;#039;&amp;#039;не обязана быть точной&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
* если нужный блок ближе трёх блоков вперёд, драйвер не мотает вообще, а дочитывает ленту воспроизведением;&lt;br /&gt;
* иначе он считает время перемотки по модели «время от начала ленты до блока N» и мотает разность двух таких времён. Модель нелинейная — скорость перемотки зависит от намотанного радиуса, — а набор её констант выбирается параметром: тип кассеты для системы настройка, а не открытие;&lt;br /&gt;
* назад драйвер целится на блок раньше нужного и дочитывает вперёд;&lt;br /&gt;
* после перемотки идёт пуск, и где машина оказалась на самом деле, ей снова сообщает маркер.&lt;br /&gt;
&lt;br /&gt;
Ошибка модели съедается на этом последнем шаге. Для эмулятора это означает, что&lt;br /&gt;
скорость перемотки можно задавать любую: система всё равно найдёт себя по маркеру.&lt;br /&gt;
&lt;br /&gt;
Отсюда и заметная пауза после каждого блока данных — около секунды ленты, запас на&lt;br /&gt;
торможение и разгон лентопротяжки. Перед маркером пауза больше (≈1.1 с), перед&lt;br /&gt;
блоком данных меньше (≈0.7 с).&lt;br /&gt;
&lt;br /&gt;
=== Формат .bt ===&lt;br /&gt;
&lt;br /&gt;
Контейнер образов лент Юниора и Арго. Заголовок файла в четыре байта, дальше для&lt;br /&gt;
каждой записи три слова и сами данные.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Первые два слова — это не пауза, а время&amp;#039;&amp;#039;&amp;#039;: когда запись начинается и сколько&lt;br /&gt;
длится. Единица такова, что на байт приходится 3.3–3.6, то есть миллисекунда при&lt;br /&gt;
скорости около 2400 бод. Отношение длительности к длине одно и то же у всех записей&lt;br /&gt;
всех имеющихся лент, и Юниора, и Арго.&lt;br /&gt;
&lt;br /&gt;
Настоящая пауза — это начало записи минус конец предыдущей. Это не придирка:&lt;br /&gt;
прочитанное как пауза второе слово даёт перед маркером 111 мс вместо 1100, и&lt;br /&gt;
драйвер ленточного тома перестаёт находить блоки — именно на этом и встал Арго,&lt;br /&gt;
пока формат читали неверно.&lt;br /&gt;
&lt;br /&gt;
Третье слово — длина записи, причём она &amp;#039;&amp;#039;&amp;#039;считает преамбулу&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Образ из одного заголовка — это чистая кассета: записей нет, а лента есть. Длину&lt;br /&gt;
такой ленты из файла взять неоткуда; разумное значение — полчаса, сторона С-60.&lt;br /&gt;
&lt;br /&gt;
== Диски TCP/M ==&lt;br /&gt;
&lt;br /&gt;
Дисков у системы три, и лента из них — только два:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;A:&amp;lt;/code&amp;gt; — квазидиск в дополнительной памяти (блок 1). Загрузчик с кассеты раскладывает систему туда и оттуда её запускает, так что &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt; без буквы показывает квазидиск, а не кассету;&lt;br /&gt;
* &amp;lt;code&amp;gt;B:&amp;lt;/code&amp;gt; — заряженная кассета: к букве привязан сам образ, и его метка видна в верхней строке экрана (&amp;lt;code&amp;gt;B: = CII. A&amp;lt;/code&amp;gt;);&lt;br /&gt;
* &amp;lt;code&amp;gt;C:&amp;lt;/code&amp;gt; — второй кассетный том на том же магнитофоне.&lt;br /&gt;
&lt;br /&gt;
Каталог кассеты система держит в памяти, поэтому &amp;lt;code&amp;gt;DIR B:&amp;lt;/code&amp;gt; отвечает сразу —&lt;br /&gt;
лента пойдёт только за самим файлом.&lt;br /&gt;
&lt;br /&gt;
Под TCP/M запись доходит до ленты не сразу: система держит сектор в памяти и выносит&lt;br /&gt;
его на кассету, когда он ей больше не нужен — на перезапуске ОС или при обращении к&lt;br /&gt;
другому сектору. Тогда лентопротяжка ищет место по маркерам и переписывает блок, а&lt;br /&gt;
следом, отдельной операцией, каталог.&lt;br /&gt;
&lt;br /&gt;
== Запись на кассету ==&lt;br /&gt;
&lt;br /&gt;
Штатный &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; пишет ленту &amp;#039;&amp;#039;&amp;#039;не как остальная система&amp;#039;&amp;#039;&amp;#039;: лентопротяжку он&lt;br /&gt;
не трогает вовсе, а просто выкладывает блоки точкой входа монитора &amp;lt;code&amp;gt;$F80C&amp;lt;/code&amp;gt;.&lt;br /&gt;
Запись включает человек — кнопкой на магнитофоне.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
COPY CT:=A:CPM55     кассета пишется с нуля&lt;br /&gt;
COPY A:=CT:CPM55     файл читается обратно&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Получается настоящая кассета: заголовок с именем файла и числом записей, дальше пары&lt;br /&gt;
«маркер — блок» с паузами.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;А вот разметить кассету под сектора TCP/M с клавиатуры не удалось.&amp;#039;&amp;#039;&amp;#039; Процедура в&lt;br /&gt;
драйвере это умеет (два сектора оглавления), но система находит место на ленте&lt;br /&gt;
только по маркерам, ПЗУ ждёт синхросимвол без таймаута (&amp;lt;code&amp;gt;$FBB3&amp;lt;/code&amp;gt;), и любой&lt;br /&gt;
путь к записи на незнакомую кассету начинается с чтения. Кассета без маркеров поэтому&lt;br /&gt;
уводит машину в ожидание до конца ленты.&lt;br /&gt;
&lt;br /&gt;
== Звук ==&lt;br /&gt;
&lt;br /&gt;
Канал 2 КР580ВИ53 стробируется разрядом 4 порта C, а &amp;#039;&amp;#039;&amp;#039;тактируется строчной частотой&lt;br /&gt;
ВГ75&amp;#039;&amp;#039;&amp;#039; — 14675 Гц при текстовом растре.&lt;br /&gt;
&lt;br /&gt;
Высоту тона это задаёт целиком, и она следует за развёрткой: перепрограммировал&lt;br /&gt;
экран — поехал тон. Для эмулятора это значит, что таймер нельзя тактировать&lt;br /&gt;
системной частотой, иначе весь звук машины уйдёт мимо.&lt;br /&gt;
&lt;br /&gt;
== Цвет ==&lt;br /&gt;
&lt;br /&gt;
Палитра снимается из ПЗУ К555РТ4. В сохранившемся дампе есть только первая страница;&lt;br /&gt;
вторая (разряд 6 порта C) неизвестна.&lt;br /&gt;
&lt;br /&gt;
Атрибут поля ВГ75 действует &amp;#039;&amp;#039;&amp;#039;до конца экрана&amp;#039;&amp;#039;&amp;#039;, а не до конца строки. На Юниоре это&lt;br /&gt;
видно прямо: в экранном буфере всего два атрибута, оба в нулевой строке — красный для&lt;br /&gt;
строки состояния и ещё один ближе к её концу, от которого весь остальной экран&lt;br /&gt;
зелёный.&lt;br /&gt;
&lt;br /&gt;
== Команды монитора ==&lt;br /&gt;
&lt;br /&gt;
Одиннадцать команд, латинские буквы от C до M. Диспетчер и таблица переходов лежат&lt;br /&gt;
по &amp;lt;code&amp;gt;$FD51&amp;lt;/code&amp;gt;: у каждой команды там свой адрес и число аргументов.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; начало,конец || контрольная сумма блока (простая сумма байт)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; начало,конец || дамп памяти&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; начало,конец || запись блока на ленту, лентопротяжку включает сама&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; байт,начало,конец || заполнение памяти&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; адрес || просмотр и правка памяти&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || просмотр и правка регистров: D, B, H, A, S, P&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || ввод с магнитофона и запуск прочитанного&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; адрес || побайтный просмотр с правкой&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || пересылка между основной и дополнительной памятью: канал 0 ПДП адресует основную память, канал 1 — блок, направление задаёт триггер &amp;lt;code&amp;gt;$50&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || загрузка 16 Кбайт из блока расширения 7 по адресу 0040 и запуск&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Те же команды доступны с дополнительного блока клавиш: К1–К5 дают A–E, а ПОМ, УСТ и&lt;br /&gt;
ИСП — G, H и I.&lt;br /&gt;
&lt;br /&gt;
== Клавиатура ==&lt;br /&gt;
&lt;br /&gt;
Таблица кодов ПЗУ лежит по &amp;lt;code&amp;gt;$F9E0&amp;lt;/code&amp;gt;. Соответствие клавиш проверено прогоном&lt;br /&gt;
всех 88.&lt;br /&gt;
&lt;br /&gt;
Модификаторы лежат &amp;#039;&amp;#039;&amp;#039;в самой матрице&amp;#039;&amp;#039;&amp;#039;, и их состояние ведёт ПЗУ, а не схема; оно же&lt;br /&gt;
показано в верхней строке экрана справа. НР и УПР защёлкиваются до следующей клавиши,&lt;br /&gt;
АЛФ (РУС/ЛАТ), ГРАФ и ФИКС переключают разряды признака в ПЗУ.&lt;br /&gt;
&lt;br /&gt;
Две клавиши не определены однозначно: стрелки ← и ↑ различаются только кодами 14 и&lt;br /&gt;
15, а ПЗУ их не обрабатывает.&lt;br /&gt;
&lt;br /&gt;
== Что осталось невыясненным ==&lt;br /&gt;
&lt;br /&gt;
* разметка кассеты средствами самой ОС;&lt;br /&gt;
* вторая страница палитры.&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/Юниор_ФВ-6506 Статья в Википедии];&lt;br /&gt;
* [https://alemorf.github.io/retro_computers/computer.html?id=Unior_FV-6506 Схема, дампы ПЗУ, образы лент и фотографии] — каталог Алексея Морозова. В образе &amp;lt;code&amp;gt;jn.a.bt&amp;lt;/code&amp;gt; первая запись повреждена, с него система не грузится.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Юниор]]&lt;/div&gt;</summary>
		<author><name>Panther</name></author>
	</entry>
</feed>