ПЭВМ Дуэт — это российский клон 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 виде. Использовались для отладки программ в машинных кодах. По сравнению с ними, спектрумовский «монитор» был очень крут. А то, что мы сейчас называем «монитор», тогда чаще называли «дисплеем».

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

Ссылки
ZX Spectrum для пользователей и программистов — системные переменные — NMIADD
ZX-Ревю 1991 №1 — Секреты пзу — NMIADD и ошибка в ПЗУ
Микропроцессорный комплект Z80. Книга 1. 6. Система прерывании. — про NMI
«Полный дизассемблер ПЗУ ZX-Spectrum» на русском
Z80 Instruction table
Поделиться с друзьями
-->

Комментарии (34)


  1. vesper-bot
    23.06.2017 10:21
    +1

    Давным-давно, когда я ещё не знал ни о каком ассемблере, я нарвался где-то на команду RANDOMIZE USR 100, которая на моем самопаянном спектруме вызывала какое-то интересное поведение, наподобие хекс-редактора, в котором я не сумел тогда разобраться и забил. Может, это и есть "монитор"?


    1. UA3MQJ
      23.06.2017 10:46
      +4

      На моем Дуэте, как и на обычном спектруме, при этой команде происходит сброс. Но я помню такой монитор у друга на спектруме. Там было другое ПЗУ с монитором. При нажатии кнопки сброс, компьютер не сбрасывался и можно было подправить ячейки в памяти, чтобы увеличить количество жизней. Я нашел на форуме эту ROM от 91 года и попробовал подставить в эмулятор.

      Вот что вышло:
      image


      1. vesper-bot
        23.06.2017 11:12

        Очень похоже :) знакогенератор, правда, не помню, который у меня был, но запросто мог быть именно вот этот. Кстати, вопрос, а может быть такое, что из-за ошибки в байте 109 доступ в "монитор" оказывался открытым? Т.е. если в прошивке Дуэта заменить байт 109 на 40, может и "монитор" откроется?


        1. UA3MQJ
          23.06.2017 11:23

          Нет, ошибка там как раз исправлена. Теперь можно сделать кнопку NMI и загрузить в ОЗУ вообще любой монитор. И по кнопке его в заходить. А в ПЗУ Дуэт монитора, к сожалению, нет


          1. vesper-bot
            23.06.2017 12:41

            Я понял по-другому. По кнопке NMI управление передается на 0x0066, там идет проверка на ноль значения переменной NMIADD, и если там таки 0, то исправленный код выполняет переход на 0, взяв его из NMIADD (!!!), иначе выполняет RETN (т.е. обработчик NMI это подобработчик какого-то другого кода). А вот непатченная прошивка выполняет переход на NMIADD, если там НЕ ноль, а раз управление попадает в итоге в отладчик, то он там есть. Нужно смотреть, что и когда записывается в адрес (NMIADD) и смотреть, а есть ли код по этому адресу в прошивке Дуэта — думаю, кстати, найдется.


            1. UA3MQJ
              23.06.2017 12:57

              Я так понял, что это системная переменная и в нее можно заносить любое значение. По своему усмотрению.


              1. vesper-bot
                23.06.2017 13:36

                Ну да, а так как в нормальном режиме там должны быть нули, но их там нет, если переход идет в правильное место, значит, туда при старте пишется какое-то значение. Его по-хорошему надо подсмотреть (PEEK), и посмотреть по этому адресу в ПЗУ. Мне смотреть нечем, поэтому ищу в книжке.


                1. UA3MQJ
                  23.06.2017 14:40

                  Посмотрел на Дуэте. После включения там ноли (23728, 23729). Посмотрел в эмуляторе на прошивке с монитором в ПЗУ — тоже ноли. Хотя по эмуляции NMI запускается монитор.


                  1. vesper-bot
                    23.06.2017 15:05
                    +1

                    Значит, в прошивке с монитором другой код по смещению 0x0066. Жалко, но это означает, что "монитора" в Дуэте действительно нет.


                1. UA3MQJ
                  23.06.2017 14:47

                  Впрочем, переменная рабочая. Я помещаю в нее отличное от ноля значение, например 255 в оба байта. Значит, по NMI процессор должен перейти на 65535, а потом в 0 и сброс. И действительно, после этого при нажатии кнопки NMI я перестал попадать в монитор. Похоже, что в версии прошивки с монитором, NMI или RAND USR 102, по умолчанию при 0000 в NMIADD происходит переход на встроенный монитор.


                  1. vesper-bot
                    23.06.2017 15:13

                    Кстати, можно помимо проверки кода по 0x0066 проверить код на 0x0000 — из мануала я понял, что poweron-вход не на 0х0000, а на 0х0038 (выполняется инструкция 0xff), а вот её RET может вести не на 0х0000, а скажем напрямую на START/NEW, тогда код в 0х0000 может содержать переход на монитор.


        1. vesper-bot
          23.06.2017 11:35

          -del-


      1. Caelwyn
        23.06.2017 11:45

        У меня на орели был такой редактор при нажатии на кнопку NMI. Но у него было не орелевское ПЗУ, а какое-то другое, плюс у него был контроллер дисковода. Ещё было интересное поведение — если загрузить что-то с диска, выдернуть контроллер дисковода и нажать кнопку RESET, то всё как-бы сбрасывалось, выпадало в бейсик, но память при этом не очищалась, и её можно было выгрузить на ленту.


        1. UA3MQJ
          23.06.2017 11:48

          Интересно, почему не орелевское. И дополнительные кнопки все работали?


          1. Caelwyn
            23.06.2017 11:59
            +1

            Мне он достался уже переделанным (внутри была не родная ПЗУ и куча МГТФ, не помню уже насчёт дополнительных микросхем, вроде как их не было, но точно были выведены какие-то сигналы на системный разъём), с дисководами, но в комплекте с родной инструкцией. То что описывалось в инструкции и близко было не похоже на то, что было у меня. Родной орелевской ПЗУ я не видел никогда, но, судя по всему там было что-то своё, с русской расскладкой клавиатуры. У меня же была оригинальная, судя по копирайту при запуске. Собственно кнопка переключения раскладок у меня не работала, и вроде были перепутаны некоторые шифты, но это не точно. Но стрелки работали, скорее всего они просто иммировали нажатие шифта с цифрой.


        1. olku
          23.06.2017 15:53
          +1

          На Орели по нажатию NMI можно было попасть в отладчик памяти и поиздеваться над работающей программой


          1. Pinsky
            23.06.2017 16:31
            +1

            его нужно было сначала загрузить в теневое ОЗУ.


      1. QDeathNick
        23.06.2017 16:22
        +2

        Монитор и есть.
        А вот его команды:
        1 — переключает систему счисления 16/10;
        2 — переключает цифровое/символьное представление;
        3 — запрашивает число и заносит его в текущий регистр;
        4 — запрос числа с заносом его в текущую сетку памяти;
        CS+5 — на 64 адреса назад;
        CS+6 — на 1 адрес назад;
        CS+7 — на 1 адрес вперед;
        CS+8 — на 64 адреса вперед;
        CS+9 — перейти к предыдущему регистру;
        CS+0 — перейти к следующему регистру;
        SS+7 — запрос числа и вызов подпрограммы по введенному адресу;
        SS+0 — если командная строка пуста, то выход из монитора в Basic;
        ПРОБЕЛ — устанавливает ячейку согласно введенному числу.


    1. bahn
      23.06.2017 12:58

      А я случайно наткнулся в ходе экспериментов: практически все игры запускались из бейсика через RANDOMIZE USR ###, ну и при недогрузившейся программе можно было запустить её с некоторой вероятностью. При этом редактор вполне запускался при числовых значениях в каком-то диапазоне от 90 до 120, емнип


    1. saboteur_kiev
      24.06.2017 04:38
      +1

      usr xxx — просто команда бейсика для запуска машинного кода по указанному адресу.
      Можно было использовать что угодно — run user xxx, randomize usr xxx.


      1. dizzy7
        26.06.2017 14:45

        Насколько я помню — usr вызывал программу и возвращал в бейсик содержимое регистра BC, поэтому randomize usr был наиболее простым способом проигнорировать этот возврат


        1. saboteur_kiev
          27.06.2017 15:51

          Почти так.
          usr xxx — выполнить машинный код по адресу xxx

          randomize usr xxx — выполнить машинный код, а полученное значение использовать в качестве стартового значения для генерации случайного числа
          print usr xxx — выполнить машинный код, а результат возврата вывести на экран
          Но по сути, после usr xxx, машинный код мог и не иметь конечного return чтобы вернуться в бейсик.

          Например среднестатистический взлом игрушки мог выглядеть, как
          1. Разобраться с загрузчиком игры — куда она грузит основной код и с какого адреса XXX его запускает
          2. Загрузить основной код игры, без его запуска
          4. Модицифировать код (найти ту же команду dec 1, которая отнимает жизнь)
          5. randomize usr XXX — запускаем игру и имеем бесконечное кол-во жизни, при этом возврат в бейсик уже не произойдет.

          «загрузить блок кода игры»

          Не забываем также, что ревизий Спектрума было много, на ранних спектрумах не факт, что возвращаемое значение могло быть обработано в бейсике.
          Зато вот в следующих версиях, с операционной системой, можно было использовать дополнительные параметры, чтобы из бейсика запустить машинный код и передать ему аргумент
          print usr xxx, «hello world»

          ну и по адресу 0 находился собственно загрузчик Spectrum-а, для старых версий — запуск бейсика, то есть randomize usr 0 — перезагрузка.


  1. Dovgaluk
    23.06.2017 12:51
    +1

    ZS Scorpion 256 рулит!


  1. Timur_n
    23.06.2017 13:27
    +1

    это встроенный инопланетный уроборос, впрочем поздно пытаться понять что это, вы его выпустили на свободу… (извините не смог удержаться от шутки)


  1. delvin-fil
    23.06.2017 14:48

    У пентагона такого не было.
    И да, в 16363 он не позволял писать.


  1. GreenStore
    23.06.2017 16:02
    +2

    Монитор в прошивке 1990 вызывал звездочкой (*).
    По ссылке в комментариях выше об этом упоминается.


    1. UA3MQJ
      23.06.2017 16:21

      А я гляжу, у многих была прошивка с монитором


    1. PaulZi
      26.06.2017 16:02

      Да. Ещё там был вроде + и ввод для двойной скорости записи на ленту.


  1. robert_ayrapetyan
    23.06.2017 18:17

    Удивляюсь — откуда у всех такие качественные клоны, до сих пор живые. У меня был клон спектрума от НПЦ «Профессионал», что сделан в Одессе «на Малой Арнаутской» улице, там кнопки вылетали в разные стороны после пары нажатий, вечно перегревался трансформатор, портил дискеты, пару лет всего прожил.


    1. Pinsky
      23.06.2017 18:46

      У многих из нас были клоны собранные в адских самопальных «гробах» и там можно было оттащить блок питания подальше от плат и дисководов.

      Мой профик реально чуть потерял стабильность после запаивания в него МГТФ-ом NemoIDE контроллера — но тут беда моего монтажа была.


  1. VolCh
    24.06.2017 00:57
    +1

    Столь плотно со Спектрумом не работал, но в близком к нему семействе «ПЭВМ» на i8080? (К(Р)?580ВМ80*) системным монитором традиционно назывался низкоуровневая ассемблерно-подобная shell, позволяющая вводить-выводитб хекс-дампы, загружать/выгружать из магнитофона в память и, главное, запускать эти чистые бинаринки. Таким образом запускался и 80
    По сути монитор был аналогом современного bios boot loader или grub, но более низкоуровневым и интерактивным.


    1. VolCh
      24.06.2017 01:06

      80 значит клоны/форки *Basic*80.На системный монитор хватало 2кб, включая весь «биос», по памяти порядка 700 байт на системные функции (" биос") и 1300 на собственно монитор, шелл, интерпретатор команд с клавиатуры. Всего 2кб ПЗУ в старших адресах f800+ на полный контроль над системой, включая загрузку Basic (около 8 КБ) со своими командами загрузки/выгрузки с магнитофона.


      1. vitalyvitaly
        24.06.2017 09:48

        Монитор в ПЗУ это именно особенность ранних 8080 или 6502 — компьютеров (Apple II первой модели и более ранних). На более поздних 8-битках монитора с командами чаще всего уже не было, например на ранних Атари 800 даже Бейсика в ПЗУ не было, немая загрузка с кассеты запускалась парой служебных клавиш.Мониторы имелись в БК-0010, в ДВК это был «пультовый отладчик» вроде бы.


  1. netch80
    24.06.2017 07:17
    +2

    «Системный монитор» в микрокомпьютерах того времени это аналог BIOS в линии x86. Входят некоторые стандартные процедуры типа вывести символ на экран в режиме телетайпа, настроить видеорежим и т.п., стартовая инициализация и помощь в загрузке, если умеет грузиться с диска.
    Точно так же было на Apple II и его советском клоне «Агат».
    Так что поиск должен завершиться результатом в виде списка этих системных подпрограмм (адреса вызова, интерпретация регистров).