Где в ZX Spectrum системный монитор? Загадка ПЭВМ Дуэт

в 7:12, , рубрики: отладка, Программирование, метки: , ,

Где в ZX Spectrum системный монитор? Загадка ПЭВМ Дуэт - 1ПЭВМ Дуэт — это российский клон ZX Spectrum 48k, производился Лианозовским электромеханическим заводом (ЛЭМЗ). Это мой самый первый компьютер и он со мной до сих пор. С юного возраста я начал постигать на нем азы программирования, микропроцессорных архитектур и проектирования цифровых схем. Но с тех пор мне не давал покоя вопрос: где системный монитор? Ведь он упоминается в документации. В стандартном ZX Spectrum я не припомню наличия какого-либо системного монитора. И в документации про системный монитор больше ни слова. Существует Монитор для 48к в ПЗУ версии от 1990г. Однако, после включения, ПЭВМ Дуэт выводит на экран вместо стандартного приветствия — "(с) 1982 sinclair research ltd" другое приветствие: "(с) DUET". А это значит, что ПЗУ там всё же изменено. А может быть есть аппаратные возможности мониторинга? К примеру, клон Орель БК-08 имеет целый ряд доработок: теневое ОЗУ, кнопка NMI и монитор MZ80. Было бы очень интересно, спустя столько лет, найти какие-то скрытые возможности своей железки.

Наконец-то я нашел ответ на вопрос, который меня периодически волновал все эти годы.

image

Почему сейчас?

Как известно, спектрумизм — почти неизлечим. И длительные периоды ремиссии могут сменяться обострениями под воздействиями внешних факторов: какая-нибудь статья, юбилей спектрума, и вот ты снова на форумах, снова с полки на стол идут спектрумы(которых не один и даже не два) и включаются и работают (или нет). И потом, постепенно отпускает. Но некоторые вопросы, так и остаются неразрешенными и они так и висят где-то глубоко в подсознании и каждый раз норовят вырваться обратно. Не решены они, как правило, в силу аппаратной неактуальности платформы (что на самом деле спорно). А что, если разрешение давнишних вопросов, проблем или желаний, пусть уже и не актуальных сейчас, может порадовать себя нынешнего? Ведь сейчас это сделать проще. Я думаю, стоит попробовать!

Очередное пришествие вопроса о мониторе

Впервые вопросом про монитор я задался практически сразу после покупки, но ответа так и не нашел. Уже в наше время, в начале 2016 года я попробовал узнать на форуме, но ответ опять не нашелся. Вопрос так бы и забылся, но случайно на глаза попалось объявление о продаже клона спектрума — «Нафаня», и там была фотография странички документации, в которой было написано: «ПЗУ содержит интерпретатор языка Бейсик и системный монитор». Ну и мы решили все же разобраться и поставить точку в этом вопросе

image

Товарищи по форуму дали совет:

Скорее всего под системным монитором понимается набор стандартных подпрограмм ПЗУ. Попробуйте:
1. посмотреть на плате установленные ПЗУ, похоже что у вас стоит 2 шт по 8К, это 16К, если дополнительных ПЗУ нет, то искать нужно среди имеющихся 16К.
2. слить дамп ПЗУ и сравнить со стандартным синклеровским, обычно менялась только надпись в клонах. По различиям можно прикинуть есть-ли что-то интересное.

Ну не может быть, что все так просто! Изучение схемы показало, что никаких дополнительных ПЗУ там нет: две ПЗУ по 8Кб (составляющие стандартные 16кБ ПЗУ с бейсиком). Судя по фотографии внутренностей именно моего экземпляра, мой вариант ничем не отличается от схемы на сайте (на самом деле, есть мелкие доработки/изменения, о которых, может быть, в другой раз). Таким образом, аппаратных возможностей для существования монитора не обнаружено.

Сверяем дампы ПЗУ

Для того, чтобы слить дамп и сверить его с оригиналом, нужно проделать следующие шаги:

1) Получить данные из ПЗУ на ПЭВМ Дуэт. Вынимать ПЗУ из платы и пользоваться программатором для этого вовсе не требуется. По той простой причине, что ПЗУ в 48к версии целиком отображается в адресное пространство по адресам 0..16383. Это самый низ адресного пространства. Ее можно как считывать программно, так и сохранить через магнитофонный выход командой Бейсика SAVE "ROM" CODE 0, 16384

2) Преобразовать данные из звукового файла в TAP файл с помощью утилиты на ПК
3) Извлечь данные из формата TAP в двоичный формат
4) Написать или найти утилиту для сравнения побайтно двух двоичных файлов — с Дуэта и с оригинального спектрума.

Уже на первом этапе я эту идею отбросил, потому что в ноутбуке нет линейного входа, да и переходник у меня спаян только в сторону воспроизведения звука на ПК или смартфоне через линейный выход для подключения на вход ПЭВМ Дуэт. Потому что 99% времени сейчас это загрузка данных в Дуэт, а не наоборот.

Поэтому я решил поступить с точностью до наоборот. Взять оригинальное ПЗУ и загрузить его в оперативную память Дуэта через магнитофонный вход. Затем написать программу для сверки данных в ячейках памяти с выводом информации отличающихся ячеек. Двоичные данные оригинального ПЗУ есть практически в каждом эмуляторе ZX Spectrum. Но для перевода их в звук, для последующей загрузки через магнитофонный вход, пришлось немного повозиться. Я перебрал 3-4 программы, прежде чем смог сделать из двоичного файла TAP файл. Потом уже проще — с помощью утилиты Tape2WAV получил звуковые файлы.

Для загрузки данных с магнитофона в Бейсике ZX Spectrum используется команда LOAD, с параметрами, которые указывают, что грузится код, и в какой адрес памяти его грузить, соответственно, команда LOAD "" CODE 40000 загрузила данные оригинального ПЗУ в память, начиная с адреса 40000.

Написание программы для сверки памяти

Я радостно потираю руки, потому что придется вспомнить свой школьный опыт и программировать под ZX Spectrum причем на нём самом! А, впрочем, чего там вспоминать? Бейсик забыть невозможно, тем более такой простой. Ошибиться в наборе команд трудно, потому что каждое нажатие клавиши вводит сразу целую команду. Быстро и удобно, как Т9, только для Бейсика! Еще хочу сказать, что пользоваться 48к Бейсиком на эмуляторе как раз не удобно, из за того, что на современных компьютерах не подписаны команды Бейсика. Еще один плюс даже такой маленькой машины, как 48к: мы сразу готовы к работе после включения. Никакую среду разработки, компилятор загружать не потребуется. Все, что нужно для работы — есть в ПЗУ.

Бейсик внутри ZX Spectrum интерпретируется. Это снижает скорость работы программ. Но писать такую простую и не критичную к скорости программу на ассемблере — это я считаю уже перебор. Программа пишется за 5 минут. И даже если она будет работать столько же, то меня это устроит. Но оказалось, что потребовалось даже меньше пяти минут:

image

На скриншоте программа, которую я набрал в эмуляторе (только для того, чтобы сделать скриншот с исходным кодом). Такую же програму я набрал на Дуэте. Поверх скриншота я подписал данные по различиям, найденным в ячейках памяти. Чтож, изменений не так и много. Теперь нужно понять, чего коснулись эти изменения. Для этого нужно знать, что находится в ПЗУ по найденным адресам. К счастью, вся информация есть в книге «Полный дизассемблер ПЗУ ZX-Spectrum» на русском.

Ячейка 109 — в оригинальной ПЗУ 40d в Дуэте 32d
006d 32 вместо 40. Значит 20h(JR nz,*) вместо 28h (JR z,*), а в книге jr nz.

image

Как оказалось, в изначальной версии ПЗУ от 82 года, в этом месте допущена ошибка. Это код обработки немаскируемого прерывания. Без этой ошибки, можно задать в переменной NMIADD адрес перехода на обработчик, например, тот же монитор. И по сигналу NMI (кнопкой NMI, как на Орель БК-08), компьютер перешел бы на этот обработчик. Исправления по этому адресу говорят о том, что в Дуэте эта ошибка исправлена и сигнал NMI может полноценно использоваться. Чтож, уже не плохо, но судя по количеству оставшихся изменений в ПЗУ, код монитора в него всетаки не вшит :(

Ожидаемо, 4 байта — это «DUET» вместо (С) 1982 Sinclair Research Ltd
1539 (C)
153A пробел " "
153B 68 "D"
153C 85 "U"
153D 69 "E"
153E 212 последний символ. инвертированный. 212d + 80h = 54h - "T"

(СООБЩЕНИЯ — Каждое сообщение выдается с инвертированным последним символом (+80, шестнадцатеричное).

Монитора нет, расходимся?

К сожалению, никакого системного монитора-отладчика я не нашел, хотя очень старался. Но я очень рад, что смог это выяснить самостоятельно… Но. Но что же такое «системный монитор»? Почему про него написано в доументации к Дуэту и Нафане? Как и было написано выше, «Скорее всего под системным монитором понимается набор стандартных подпрограмм ПЗУ». Так же, в книге с полным дизассемблером ПЗУ ZX Spectrum мы можем прочитать следущее:

...
ПОЛНОЕ ОПИСАНИЕ ПЗУ КОМПЬЮТЕРА ZX SPECTRUM
...
ВВЕДЕНИЕ
Монитор Spectrum, объемом 16K, представляет собой сложную программу в машинных кодах
Z80. Ее можно разделить на три основные части:
а. Программы ввода/вывода.
б. Интерпретатор BASIC.
в. Вычислительные процедуры.
Однако, для подробного описания эти блоки слишком громоздки, и поэтому монитор
разделен еще на 10 частей. Каждая часть будет представлять собой элемент монитора.

В последние годы, когда кто-то пишет про ZX Spectrum, то содержимое ПЗУ он скорее всего назовет ОС ZX Spectrum — это встроенный Бейсик. Но в те времена, видимо, такого понятия еще не сформировалось. Были небольшие программы — мониторы для просмотра и изменения содержимого ячеек памяти в HEX виде. Использовались для отладки программ в машинных кодах. По сравнению с ними, спектрумовский «монитор» был очень крут. А то, что мы сейчас называем «монитор», тогда чаще называли «дисплеем».

Таким образом, произошло некое изменение значений понятий. Монитор тогда и монитор сейчас — это разные понятия. Так что, можно считать, что монитор все же найден :) А может у кого-то есть дополнительные сведения?

Автор: UA3MQJ

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js