Арго ФВ-6511/Техническая информация
| Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0. |
Материал собран при написании эмулятора Арго для eCat3 (2026).
Схемы Арго не сохранилось, руководств с описанием железа тоже нет. Всё, что здесь написано, снято из ПЗУ монитора (2 Кбайт), из софта на единственном уцелевшем образе ленты, из видеозаписи работающей машины и из описания разрядов, которое дал на zx-pk.ru участник, восстанавливавший схему. Там, где что-то принято на веру или выведено косвенно, это сказано прямо.
Коротко о машине
Наследник Юниора ФВ-6506 и, по сути, та же машина на Z80: та же карта памяти, тот же набор микросхем (ВГ75, ВТ57, ВИ53, ВВ51), тот же формат ленты и та же система TCP/M.
Отличий три:
- процессор Z80 на 3 379 200 Гц;
- другие адреса портов;
- знакогенератор лежит не в ПЗУ, а в ОЗУ — машина заполняет его сама.
Плюс то, ради чего машину помнят: режим 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, не трогая байт диска.
Что она делает:
- чистит экран, печатает заставку и читает с кассеты
KBD.SNCпо$4000(1536 байт, обработчик клавиатуры) иROM.SNCпо$5800(16384 байта — это ПЗУ ZX Spectrum как есть); - готовит по
$4800картинку для ВГ75: четыре с лишним сотни пар «код знака, атрибут» со всеми 128 кодами подряд; - переносит себя по
$99C5и оттуда, уже не завися от нижней памяти, копирует ПЗУ Спектрума из$5800в$0000-$3FFE, а ещё$2200байт из$D600в$5000; - дожидается кадрового импульса ВГ75, перепрограммирует его на 80 знаков в строке, 16 строк, 16 растровых строк в знакоместе, наводит канал 2 ВТ57 на
$4800и запускает развёртку; - пишет
$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 |
записать в блок дополнительной памяти |
Источники
- Дампы ПЗУ и образ ленты — каталог Алексея Морозова;
- тема об Арго на zx-pk.ru — описание разрядов регистра конфигурации (сообщение 590) и замеры частот;
- Видеозапись работающей машины — по ней сняты цвета, порядок входа в режим ZX и поведение сброса.