Как стать автором
Обновить

Комментарии 35

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

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

Похоже? )

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

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

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

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

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

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

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

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

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

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

Монитор и есть.
А вот его команды:
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;
ПРОБЕЛ — устанавливает ячейку согласно введенному числу.

А я случайно наткнулся в ходе экспериментов: практически все игры запускались из бейсика через RANDOMIZE USR ###, ну и при недогрузившейся программе можно было запустить её с некоторой вероятностью. При этом редактор вполне запускался при числовых значениях в каком-то диапазоне от 90 до 120, емнип
usr xxx — просто команда бейсика для запуска машинного кода по указанному адресу.
Можно было использовать что угодно — run user xxx, randomize usr xxx.
Насколько я помню — usr вызывал программу и возвращал в бейсик содержимое регистра BC, поэтому randomize usr был наиболее простым способом проигнорировать этот возврат
Почти так.
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 — перезагрузка.
ZS Scorpion 256 рулит!
НЛО прилетело и опубликовало эту надпись здесь
У пентагона такого не было.
И да, в 16363 он не позволял писать.
Монитор в прошивке 1990 вызывал звездочкой (*).
По ссылке в комментариях выше об этом упоминается.

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

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

Мой профик реально чуть потерял стабильность после запаивания в него МГТФ-ом NemoIDE контроллера — но тут беда моего монтажа была.
Столь плотно со Спектрумом не работал, но в близком к нему семействе «ПЭВМ» на i8080? (К(Р)?580ВМ80*) системным монитором традиционно назывался низкоуровневая ассемблерно-подобная shell, позволяющая вводить-выводитб хекс-дампы, загружать/выгружать из магнитофона в память и, главное, запускать эти чистые бинаринки. Таким образом запускался и 80
По сути монитор был аналогом современного bios boot loader или grub, но более низкоуровневым и интерактивным.
80 значит клоны/форки *Basic*80.На системный монитор хватало 2кб, включая весь «биос», по памяти порядка 700 байт на системные функции (" биос") и 1300 на собственно монитор, шелл, интерпретатор команд с клавиатуры. Всего 2кб ПЗУ в старших адресах f800+ на полный контроль над системой, включая загрузку Basic (около 8 КБ) со своими командами загрузки/выгрузки с магнитофона.
Монитор в ПЗУ это именно особенность ранних 8080 или 6502 — компьютеров (Apple II первой модели и более ранних). На более поздних 8-битках монитора с командами чаще всего уже не было, например на ранних Атари 800 даже Бейсика в ПЗУ не было, немая загрузка с кассеты запускалась парой служебных клавиш.Мониторы имелись в БК-0010, в ДВК это был «пультовый отладчик» вроде бы.
«Системный монитор» в микрокомпьютерах того времени это аналог BIOS в линии x86. Входят некоторые стандартные процедуры типа вывести символ на экран в режиме телетайпа, настроить видеорежим и т.п., стартовая инициализация и помощь в загрузке, если умеет грузиться с диска.
Точно так же было на Apple II и его советском клоне «Агат».
Так что поиск должен завершиться результатом в виде списка этих системных подпрограмм (адреса вызова, интерпретация регистров).

Недавно только узнал, что Лианозовский элекромеханический завод в начале девяностых выпускал Спектрумы в корпусе ПЭВМ Микроша. У меня культурный шок.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории