Арго ФВ-6511/Техническая информация

Материал из Emuverse
Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0.

Материал собран при написании эмулятора Арго для eCat3 (2026).

Схемы Арго не сохранилось, руководств с описанием железа тоже нет. Всё, что здесь написано, снято из ПЗУ монитора (2 Кбайт), из софта на единственном уцелевшем образе ленты, из видеозаписи работающей машины и из описания разрядов, которое дал на zx-pk.ru участник, восстанавливавший схему. Там, где что-то принято на веру или выведено косвенно, это сказано прямо.

Коротко о машине

Наследник Юниора ФВ-6506 и, по сути, та же машина на Z80: та же карта памяти, тот же набор микросхем (ВГ75, ВТ57, ВИ53, ВВ51), тот же формат ленты и та же система TCP/M.

Отличий три:

  1. процессор Z80 на 3 379 200 Гц;
  2. другие адреса портов;
  3. знакогенератор лежит не в ПЗУ, а в ОЗУ — машина заполняет его сама.

Плюс то, ради чего машину помнят: режим ZX Spectrum, который включается программой с кассеты.

Частоты

Сняты с живой машины замерами (zx-pk): символьный клок ВГ75 — 1.69 МГц, процессорный вдвое больше. Точное значение даёт лента: счёт $02C0 в канале 0 ВИ53 при 1 689 600 Гц на входе даёт ровно 2400 бод, а 2400 × 704 и есть 1 689 600. Оба клока делает один автомат на К155РЕ3 (D11/D12) из общего OSC, так что их отношение жёстко задано схемой.

Карта портов

Порт Устройство
$80 системный регистр: разряды 0–3 цвет бордюра, 4 звук
$81 пульт магнитофона: 1 запись, 2 пуск, 3 назад, 4 вперёд, 5 стоп
$A0, $A2, $A4, $A6 ВИ53: каналы 0–2 и управление
$A1 чтение — клавиатура, запись — конфигурация со стороны канала 0 ПДП
$A9 конфигурация со стороны остальных каналов ПДП
$B1, $B9 конфигурация памяти процессора (две разные ячейки!)
$C0, $C4 ВГ75: параметры и команда
$C1, $C3 ВВ51: данные и управление
$E0–$E8 ВТ57: каналы и режим
$FE в режиме ZX: клавиатура и лента Спектрума

Регистр конфигурации памяти

Самое неочевидное место машины. Порты $A1, $A9, $B1, $B9 пишут в одну и ту же микросхему, но не целым байтом — байт расходится на две разные схемы.

Младший полубайт — регистровый файл К555ИР26 (D6)

Четыре четырёхразрядных ячейки. Ячейку для записи выбирают разряды A3 и A4 адреса порта, а действующую — линии /BUSAK и /DRQ0: у процессора своя ячейка, у канала 0 ПДП своя, у остальных каналов своя.

Поэтому загрузчик TCP/M пишет конфигурацию процессора сразу в оба порта, $B1 и $B9: какая из двух ячеек действует, зависит от того, что в этот миг на /DRQ0.

  • разряд 0 — защита первых 16 Кбайт от записи;
  • разряды 1–3 — номер конфигурации, то есть строка прошивки D42.

Защиту включает ноль, и полярность эта выведена не из описания, а из самих значений, которые пишут программы. Монитор и TCP/M ставят $61 — единицу, и иначе быть не может: система обязана писать в TPA с $0100. ZX.COM последним действием пишет $D8 — ноль, а по $0000-$3FFF в этот момент лежит копия ПЗУ Спектрума, которой полагается быть ПЗУ. Для того разряд и нужен: без него первая же программа, записавшая что-нибудь по младшим адресам — а на Спектруме так делают, потому что там ПЗУ, — убила бы образ вместе с собственной машиной.

Проверяется адрес до отображения: это разряды A14 и A15, то есть первая страница адресного пространства, куда бы прошивка её ни отправила.

Старший полубайт — счетверённый триггер К555ТМ8 (D13)

Один на все четыре порта. Тактируется записью в регистр конфигурации.

разряд что делает
4 теневая область второй банки (драйвер клавиатуры ZX и часть текстовой области, которую читает ВГ75), он же включает бордюр
5 ПЗУ по $F800-$FFFF
6 зеркало ПЗУ с нуля при включении
7 разрешение кадрового прерывания на /INT

Два следствия, которые стоили времени:

Две ячейки — не одна. ZX.COM пишет в $B1 и $B9 разные значения: $CB и $D8. Живая у процессора — та, что за $B9: в одном месте ($5ED3) монитор пишет $61 вообще в одну $B9, а если бы процессор смотрел в $B1, он погиб бы на самой записи $CB — по этой конфигурации все четыре страницы уходят на $04000.

Разряд 6 взводится при включении, а не кнопкой. Отсюда всё поведение сброса — см. ниже.

Память

На двух картах памяти держится пересылка ПДП: монитор даёт одному каналу чистое $61, другому $61 с номером блока в разрядах 1–3 ($FA18 и $FA36, они же точки входа $F818 и $F81B), и переливает данные между двумя по-разному отображёнными пространствами.

Отображение у процессора и у канала разное:

  • у процессора работает прошивка D42 (MEMCFG, К155РЕ3 на 32 байта). Адресуют её два старших разряда адреса и три разряда конфигурации, в ответе — новые старшие разряды адреса и выбор банки основных 128 Кбайт. Строка для $61 — точное отображение первой банки; строка для $63 оставляет страницы 0 и 1 на месте, а страницу 3 отдаёт второй банке — там и лежит ОЗУ знакогенератора. Что страницы 0 и 1 при этом не двигаются, видно по загрузчику TCP/M: он ставит ту же конфигурацию значением $43 в трёх местах ($0105, $39AB, $7804) и продолжает выполняться из ОЗУ по этим самым страницам;
  • у канала ВТ57 номер блока выбирает банку дополнительного ОЗУ целиком, нулевой номер — основную память. По прошивке так не выходит: строк в ней восемь, и семи разных мест под блоки TCP/M среди них нет — блок 1 лёг бы на страницу 0 основной памяти, и первая же пересылка квазидиска затёрла бы саму систему. Значит, номер блока разбирает сама плата расширения, помимо D42. Проверить не по чему: листа с дополнительным ОЗУ в имеющейся схеме нет.

Строка 4 прошивки (конфигурация $8, то самое $D8 от ZX.COM) — это карта режима ZX:

страница физически что там
$0000-$3FFF $00000 первая банка, сюда ZX.COM кладёт ПЗУ Спектрума
$4000-$7FFF $18000 вторая банка — экран Спектрума
$8000-$FFFF $08000, $0C000 первая банка как есть

Знакогенератор в ОЗУ

ОЗУ знакогенератора — это $F800-$FFFF второй банки, и конфигурация $63 (у загрузчика с ленты $43) подставляет их процессору вместо обычных $F800-$FFFF на запись: читать оттуда процессор продолжает ПЗУ. Иначе он не смог бы выполнять оттуда код, пока его заполняет, — а монитор именно это и делает: обнуляет знакогенератор и переносит туда 30 своих знаков командой LDI, беря их из ПЗУ по $FF0A. Работает это потому, что весь цикл идёт по ПЗУ, а стек монитора в $F790 — в той же подставленной странице, и PUSH с POP сходятся.

Адрес точки считается как

строка*256 + ((код & $60) << 1) | (код & $1F)

то есть номер строки развёртки в старших разрядах, разряды 6 и 5 кода — в разрядах 7 и 6 адреса, разряд 5 адреса не подключён. Отсюда и знакогенератор ровно на 128 знаков в двух килобайтах, и дырки по 32 байта, которые оставляет загрузчик с ленты.

Полный набор на 128 знаков приносит с ленты загрузчик TCP/M; монитор обходится тридцатью.

Экран и цвет

Экран 80×25, знакоместо 6×10. Буфер лежит по $F7B0 и читается ПДП напрямую.

Атрибут поля ВГ75 действует до конца экрана, а не до конца строки. У Арго атрибут один — $94 в самом начале буфера, — поэтому он красит весь экран. Индекс, который из него получается, — 10.

Как определили палитру

Цвет снят с видеозаписи живой машины: на экране монитора белые буквы на синем поле. На заставке TCP/M тем же белым набраны и мелкий текст, и большие блочные буквы (на видео они кажутся желтоватыми, но это расплывание крупных светлых пятен на кинескопе: в буфере атрибут один на весь экран).

Из всех сочетаний — два сохранившихся дампа ПЗУ цветов D77, с инверсией и без, оба порядка полубайтов, обе раскладки, любая перестановка R, G и B по разрядам — белое на синем по индексу 10 дают ровно два, и оба из дампа D77_INV_I.BIN, прочитанного как есть, младшим полубайтом в чернила. Различаются они перестановкой красного с зелёным, и различить их нечем: машина пользуется одной записью палитры, а в ней обе дают одно и то же.

Разряды полубайта: 0 — красный, 3 — зелёный, 1 — синий, 2 — яркость.

Дамп D77_my.BIN не подходит ни при каком прочтении — белого на синем он не даёт вовсе. Два дампа не выводятся один из другого (у записей 8–15 они отличаются на постоянное $15, у 0–7 по-разному), то есть это два разных чтения одной микросхемы, и верным оказалось второе.

Курсор

ПЗУ Арго прибавляет единицу и к колонке, и к строке ($F928). У строки это настоящая компенсация: знакоместа ПЗУ считает от $F800 (адрес = $F800 + строка*80 + колонка, подпрограмма $F903), а ПДП читает экран с $F7B0 — на строку раньше, и эта строка занята строкой состояния.

А у колонки компенсировать нечего, и курсор встаёт на знакоместо правее того, куда ляжет следующий знак. ПЗУ Юниора — та же микросхема, тот же автор, тот же экран — к колонке ничего не прибавляет. Так что это расхождение самого ПЗУ Арго. На живой машине не проверено.

Кадровое прерывание

Своя программа Арго им не пользуется вовсе. В ПЗУ монитора нет ни одной команды прерываний — ни IM, ни EI, ни RETI/RETN, ни LD I,A: всё, что монитору нужно от кадра, он опрашивает ($FA71 ждёт разряд 5 состояния ВГ75, $FBB5 отсчитывает 20 кадров).

На схеме линия есть: тот же К555ТМ8 (D3/7), выход Q3 через ЛА3 на вывод 16 процессора (/INT), разрешение — разряд 7 конфигурации. Ставит его только ZX.COM, последним действием перед переходом в ПЗУ Спектрума; у монитора ($61, $63) и у загрузчика с ленты ($43) его нет.

Нужно оно именно для клавиатуры: ПЗУ на кассете стоковое, обработчик по $0038 стандартный (FRAMES, потом KEYBOARD по $02BF), и Спектрум читает клавиатуру только оттуда. Без прерывания матрица на $FE отвечала бы правильно, а редактор Бейсика клавиш не видел бы.

Чего со схемы не прочитать — что подаётся на вторую ножку ЛА3. Но пятидесятигерцевое в этой машине одно, кадр ВГ75, так что импульс берётся с её вывода VRTC.

Ширина импульса подбиралась, и обе её границы настоящие:

  • снизу: сразу за фронтом кадра ВГ75 идёт нулевая строка, а промежуток между пачками ПДП у неё нулевой, так что 80 пересылок идут одним куском — 320 тактов, на которые процессор снят с шины. Импульс короче этого тонет в них целиком: при 32 тактах принимается каждое пятое прерывание;
  • сверху: /INT у Z80 уровневый, и импульс, доживший до конца обработчика, тот наберёт повторно — при 800 тактах счёт идёт 56 в секунду вместо 52.

При 400 тактах принятых прерываний ровно столько же, сколько кадров выдала ВГ75, а счётчик FRAMES Спектрума ($5C78) растёт на 51.5 в секунду — это и есть частота кадров машины.

Кнопка СБРОС дёргает только процессор

Владелец живой машины рассказал три вещи: сброс в режиме ZX возвращает на начальный экран Спектрума, Ф9 из CP/M уводит в монитор, G0 оттуда возвращает в CP/M. Ф9 и G0 делает сама система. А сброс объяснился только так:

зеркало ПЗУ с нуля взводится при включении, а не кнопкой. На тёплом сбросе процессор уходит на $0000 и читает там ОЗУ:

режим что лежит по $0000 что видно
ZX копия ПЗУ Спектрума начальный экран Спектрума, секунды за две
CP/M переход на тёплый старт системы приглашение A>, диск сброшен на A:
холодный сброс зеркало ПЗУ взведено заново монитор, <

Одного зеркала мало: ВГ75 и каналы ПДП под Спектрум настраивает ZX.COM, а после сброса повторить это некому — процессор уходит в ПЗУ Спектрума, которое про ВГ75 не знает. Значит сброс не доходит и до них: кнопка дёргает вывод RESET процессора и ничего больше.

Это вывод, а не факт: схемы нет, и держится он на одном наблюдении. Другого объяснения не нашлось — своей программы, которая заново настроила бы развёртку, в этот момент не работает никакой.

Лента

Формат и тракт — те же, что у Юниора: .bt, 2400 бод, байты через ВВ51 в синхронном режиме, дистанционное управление лентопротяжкой.

Лентопротяжка

Все команды идут через одну подпрограмму ($FB95), которая разбирает код в A и выводит в порт $81:

код в A в порт $81 что
0 $04 пуск (перед ним задержка 20 кадров)
разряд 0 $06 пуск вместе с записью
разряд 1 $10 вперёд
разряд 2 $08 назад
разряд 3 $25, затем $00 стоп

Входы: $FA95 — запись, $FB36 — чтение, $FBA8 — стоп. Числа эти стоило добыть: первый же поиск OUT ($81),A по соседним байтам находит только $25/$20 и $08/$10 и наводит на мысль, что пуска в ПЗУ нет вовсе. На деле несколько путей сходятся на одном выводе в $FBC7.

Запись

Команды записи у монитора нет. Процедура в ПЗУ есть — $FA95: включает запись, ждёт две секунды, шлёт преамбулу, адреса, данные и контрольную сумму, потом останавливает ленту, — но во всём ПЗУ её не зовёт никто. То есть она оставлена точкой входа для ОС.

Порядок (снят с $FAC0 и $FA7E): ВИ53 — управляющее $36 в $A6, счёт $02C0 в канал 0, это 2400 бод; ВВ51 — три нуля в $C3 (сброс синхронизации), $40 (внутренний сброс), $8C (режим), $E6 (синхросимвол), затем команда; лентопротяжка — $06 в $81; дальше байты в $C1 по готовности передатчика (разряд 0 порта $C3). Перед каждой записью ПЗУ шлёт преамбулу AA AA 19 00 и синхросимвол $E6.

Ленточный том B:

Метки томов лежат по $E370 (B:) и $E378 (C:), сразу за ними, с $E380, идёт таблица переходов BIOS, а сам драйвер занимает $E3xx-$E6xx. До ленты он достаёт не портами, а точками входа ПЗУ: $E395 → $E5FE → JP $F806 (чтение байта), $E39B → JP $F815 (команда лентопротяжке), $E60E → CALL $F81E (задержка по кадрам). Всё это приехало из C55.A06 со сдвигом +$8600, так что разбирать можно прямо в файле, с адреса $5D80.

Обращение к диску разветвляется в $D782: при нулевом номере привода ($E712) идёт квазидиск, при ненулевом — лента, с $D896. Ленточный тракт: $DA98 опознаёт кассету (до четырёх попыток прочитать блок 0, запасной вариант — блок 1), $DC97 читает блок, $DD04 ищет маркер — кладёт 26 байт в $E719 и зовёт $DDCB сверить метку. Отсюда адреса: $E71D — номер блока из маркера, $E71F — метка. Признаки томов — $E29E (B:) и $E29F (C:); после удачного опознания в $E29E стоит $0C.

Синхронизация приёмника ищет ровно $E6 $00: $FB02 ловит синхросимвол, $FB16 забирает идущий за ним ноль. Байты $E6 попадаются и внутри блоков данных, так что пересинхронизация срабатывает вхолостую много раз за проход — за один DIR B: приёмник набирает больше десяти тысяч потерь по переполнению. Это нормальное состояние.

Чем это долго не работало. Оглавление кассеты драйвер держит в дополнительной памяти и перекладывает туда пересылками ВТ57. Пока модель дополнительной памяти выбирала один блок на всю пересылку и угадывала направление, оглавление уезжало не туда, признаки $E29E сбрасывались, метка в строке состояния гасла и DIR B: молча возвращался в приглашение. На живой машине у каждого канала своя ячейка регистрового файла, и блок может стоять на любой стороне — монитор для того и держит две точки входа, $FA18 и $FA36.

Режим ZX Spectrum

На кассете лежит ZX.COM — «программа перевода ПЭВМ "АРГО" в режим "ZX SPECTRUM", ИК АН Украины, 1991 г.»

Запускать её надо с того же тома, где лежат её файлы (B:, затем ZX): имена она строит в FCB по $005C, не трогая байт диска.

Что она делает:

  1. чистит экран, печатает заставку и читает с кассеты KBD.SNC по $4000 (1536 байт, обработчик клавиатуры) и ROM.SNC по $5800 (16384 байта — это ПЗУ ZX Spectrum как есть);
  2. готовит по $4800 картинку для ВГ75: четыре с лишним сотни пар «код знака, атрибут» со всеми 128 кодами подряд;
  3. переносит себя по $99C5 и оттуда, уже не завися от нижней памяти, копирует ПЗУ Спектрума из $5800 в $0000-$3FFE, а ещё $2200 байт из $D600 в $5000;
  4. дожидается кадрового импульса ВГ75, перепрограммирует его на 80 знаков в строке, 16 строк, 16 растровых строк в знакоместе, наводит канал 2 ВТ57 на $4800 и запускает развёртку;
  5. пишет $C1 в $A1, $CB в $B1 и $D8 в $B9 и делает JP $0000.

Процессор уходит в ПЗУ Спектрума и работает там: I = $3F, IY = $5C3A — подпись Спектрума.

Как получается картинка

Строка потока — 82 байта, из них два атрибута поля, а они в прозрачном режиме позиций не занимают. Остаётся 80 байт на строку, и берутся они по два: выходит 40 знакомест по 8 точек — четыре бордюра, 32 столбца Спектрума, снова четыре бордюра. Это 256 точек в поле шириной 320, а 16 строк по 16 растровых дают 256, из которых 12 рабочих — ровно 192 строки Спектрума. Все числа сходятся точно.

Пара — это младший и старший байты адреса атрибута Спектрума. Старший ($58, $59, $5A) — треть экрана. Младший машина раскладывает тем же проводом, которым адресует знакогенератор в обычном режиме: $60 в разряды 7–6, $1F в разряды 4–0. Свободный разряд 5 (тот самый неподключённый) берёт себе разряд 3 счётчика растровых строк — он и отличает верхнее знакоместо Спектрума от нижнего. Тот же младший байт плюс разряды 0–2 счётчика строк и треть дают адрес байта битовой карты.

Режим ZX — это не новая разводка, а та же самая с занятым свободным разрядом.

Память при этом делится: страница 1 у процессора уходит во вторую банку, куда ПЗУ Спектрума и пишет свой экран, а канал ПДП читает поток знакомест из первой. Без этого первая же CLS Спектрума затёрла бы поток — он лежит по $4800, то есть внутри экрана Спектрума.

Бордюр

Разряды 0–2 порта $FE доходят до бордюра. Рамку вокруг картинки строить не надо: место под неё есть всегда — 40 знакомест на 16 строк против 32 на 12 у картинки.

Цвет держится на каждой растровой строке, а не на кадре: при загрузке с ленты ПЗУ Спектрума переключает бордюр каждый полупериод, около 0.64 мс, то есть раз тридцать за кадр. Это те самые полосы пилот-тона, по которым владелец машины и описывал загрузку — «бордюр мигает с голубого на красный».

Звук

Динамик один, а линий к нему две, и они не пересекаются: монитор Арго дрыгает разрядом 4 порта $80 ($F8EE) и только в обычном режиме, ПЗУ Спектрума — разрядом 4 порта $FE и только в режиме ZX. Уровень ведёт тот, кто написал последним.

Клавиатура

ПЗУ на кассете стоковое: по $028E у него настоящий KEY-SCAN, читающий матрицу Спектрума портом $FE. Клавиши на Арго свои, значит матрицу ему подаёт железо; со схемы это не выяснить.

Раскладка взята из руководства к машине: сорокаклавишная сетка Спектрума положена на клавиатуру Арго по месту, буквы подписаны по-русски. Ряд QWERTYUIOP — это ЙЦУКЕНГШЩЗ, ASDFGHJKL — ФЫВАПРОЛД, ZXCVBNM — ЯЧСМИТЬ. Буквы и цифры совпадают сами собой, потому что коды ПЗУ даёт им латинские.

Три служебные клавиши стоят не там, где их ждёшь:

Спектрум Арго
CAPS SHIFT ДОП
SYMBOL SHIFT Б (запятая)
SPACE / BREAK Ю (точка)

Обе последние сидят в нижнем ряду ровно там, где у Спектрума его SYMBOL SHIFT и пробел, так что наложение по месту сходится и здесь. Собственный пробел Арго и его шифт в режиме ZX не делают ничего.

Сразу после входа в режим клавиатуры нет — её включает Ф10. Автор видеоролика так и говорит: «включается сканирование клавиатуры».

Лентопротяжка ведётся стрелками

На живой машине после load "" магнитофон пускают стрелкой вверх на клавиатуре, и это работает в запущенной игре.

Программой это быть не может. Игра занимает машину целиком и переопределяет прерывания под себя. Единственное, чего она не может заблокировать, — NMI, но и он ни при чём: образ ПЗУ Спектрума совпадает со стоковым 48K байт в байт во всех местах, где мог бы стоять перехват — $0038 (обработчик IM 1), $0066 (NMI), $028E (KEY-SCAN), $0556 (LD-BYTES), $05E7 (LD-EDGE-1), — а NMIADD ($5CB0) пуст, то есть NMI в стоковом ПЗУ 48K просто уронил бы машину в сброс.

Значит клавиши разбирает то же железо, что собирает матрицу Спектрума для порта $FE. Из видеозаписи достоверна одна стрелка — вверх, пуск; остальные три раскладываются по смыслу.

Лента Спектрума

Сигнал ленты — разряд 6 при чтении $FE. Загрузчик читает полуряд $7F и разбирает один и тот же ответ дважды: разряд 6 — сигнал с ленты, разряд 0 того же полуряда — пробел, по которому загрузка бросается. То есть клавиатура и лента делят одно чтение.

Магнитофон у машины один: со своей лентой (.bt) он отдаёт байты в ВВ51, с лентой Спектрума — ведёт уровень.

Две вещи, без которых игры не грузятся:

  • ПЗУ по $F800-$FFFF должно выключаться разрядом 5 конфигурации (в режиме ZX он сброшен). Пока оно видно всегда, тест памяти ПЗУ Спектрума упирается в $F7FF, и игра, делающая CLEAR под самый верх, отвечает «M RAMTOP no good»;
  • после последнего блока нужен ракорд. ПЗУ дочитывает блок уже после того, как тот прошёл головку: без секунды тишины в конце самый большой блок игры даёт «R Tape loading error».

На живой машине это работает хуже. Владелец пишет, что в режиме ZX грузится только первый, бейсиковский блок, а дальше «сигнал есть, но он неверный». Со схемы тракт чтения в режиме ZX не снят.

SAVE

Работает. ПЗУ пишет на ленту разрядом 3 порта $FE из SA-BYTES ($04C2), теми же длительностями, какими потом читает.

Главное, что тут выяснилось: длительности нельзя мерить абсолютными числами. ВГ75 снимает процессор с шины пачками — восемьдесят пересылок подряд в начале каждой знакоместной строки, — а SA-BYTES считает свои такты. Пачка либо попала в полупериод, либо нет, и один и тот же ноль выходит то 855 тактов, то 1175: разброс в треть, больше любого разумного допуска. Машина этого не замечает, потому что LD-BYTES меряет тем же аршином и с тем же разбросом. Измеренный пилот-тон — 2339 тактов вместо стандартных 2168.

Поэтому разбирать записанный сигнал надо как это делает настоящий загрузчик:

  • сначала поймать пилот-тон — не «импульс нужной длины», а ряд одинаковых импульсов, — и взять по нему мерку; все границы считать в долях от неё;
  • бит решать по сумме двух полупериодов, а не по каждому: пачка ПДП попадает в один из них, и в сумме её вес вдвое меньше;
  • блок кончать по тишине, а не по короткому импульсу: ноль с пачкой внутри и синхроимпульс без неё различаются уже плохо.

Проверено полным кругом на живом ПЗУ: 10 REM, save "t" даёт обычный .tap из заголовка (19 байт, контрольная сумма $D4) и блока данных FF 00 0A 02 00 EA 0D 10, и тот же файл читается обратно — «Program: t», «0 OK».

Стандартные длительности (такты Z80): пилот-тон 2168, синхро 667 и 735, ноль 855, единица 1710; пилот-тона 8063 полупериода перед заголовком и 3223 перед данными.

Что принято на веру

  • Разводка ПЗУ цветов — из двух неразличимых прочтений взято одно. Яркость (четвёртый разряд полубайта) не проверялась вовсе.
  • Положение курсора — компенсация прибавки к колонке; на живой машине не проверено.
  • Блоки дополнительной памяти — 64 Кбайт по семь штук, выведено из поведения TCP/M.
  • Стрелки лентопротяжки в режиме ZX — достоверна одна из четырёх.
  • Четыре служебные клавиши — ПЗУ не даёт им кодов, расставлены по смыслу.
  • Ширина импульса кадрового прерывания — подобрана, а не измерена, хотя обе границы диапазона настоящие.

Что осталось невыясненным

  • Ф8 в режиме ZX (на живой машине возвращает в CP/M). Программой быть не может по той же причине, что и управление лентой стрелками. Значит железо: снять разряд 4 конфигурации и дёрнуть сброс процессора. Чем именно Ф8 отличается от СБРОС, неясно.
  • Знак в левом верхнем углу, который видно на видеозаписи. Это позиция атрибута поля ($94 в самом начале буфера), и ВГ75 её гасит линией VSP. На живой машине там что-то видно, но не знак из знакогенератора: на обоих снимках он выглядит одинаково, хотя знакогенераторы совершенно разные — у монитора загружено 30 знаков и по этому коду пусто, у TCP/M полный набор и по нему буква «Д».
  • Клавиша с кодом $60 (обратный штрих) печатает апостроф, как и соседняя с кодом $27.
  • Запись на ленту из самой ОС — как это делает TCP/M, не разбиралось.
  • Бордюр в текстовом режиме. Разряды 0–3 порта $80 задают его цвет, но показ бордюра включает разряд 4 конфигурации — тот же, что включает режим ZX, — так что в текстовом его, похоже, и не должно быть видно.

Команды монитора

Одна латинская буква от C до M:

C сравнить области памяти
D вывести дамп
E записать на ленту
F заполнить область
G запустить с адреса
H задать регистр
I прочитать запись с ленты и запустить её
J найти и заменить
K прочитать из блока дополнительной памяти
L загрузить систему из блока 3 и запустить
M записать в блок дополнительной памяти

Источники