Комментарии 35
Давным-давно, когда я ещё не знал ни о каком ассемблере, я нарвался где-то на команду RANDOMIZE USR 100, которая на моем самопаянном спектруме вызывала какое-то интересное поведение, наподобие хекс-редактора, в котором я не сумел тогда разобраться и забил. Может, это и есть "монитор"?
RANDOMIZE USR 100
мы как раз попадаем в монитор!Похоже? )
Очень похоже :) знакогенератор, правда, не помню, который у меня был, но запросто мог быть именно вот этот. Кстати, вопрос, а может быть такое, что из-за ошибки в байте 109 доступ в "монитор" оказывался открытым? Т.е. если в прошивке Дуэта заменить байт 109 на 40, может и "монитор" откроется?
Я понял по-другому. По кнопке NMI управление передается на 0x0066, там идет проверка на ноль значения переменной NMIADD, и если там таки 0, то исправленный код выполняет переход на 0, взяв его из NMIADD (!!!), иначе выполняет RETN (т.е. обработчик NMI это подобработчик какого-то другого кода). А вот непатченная прошивка выполняет переход на NMIADD, если там НЕ ноль, а раз управление попадает в итоге в отладчик, то он там есть. Нужно смотреть, что и когда записывается в адрес (NMIADD) и смотреть, а есть ли код по этому адресу в прошивке Дуэта — думаю, кстати, найдется.
Ну да, а так как в нормальном режиме там должны быть нули, но их там нет, если переход идет в правильное место, значит, туда при старте пишется какое-то значение. Его по-хорошему надо подсмотреть (PEEK), и посмотреть по этому адресу в ПЗУ. Мне смотреть нечем, поэтому ищу в книжке.
-del-
Монитор и есть.
А вот его команды:
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;
ПРОБЕЛ — устанавливает ячейку согласно введенному числу.
Можно было использовать что угодно — run user xxx, randomize usr xxx.
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 — перезагрузка.
И да, в 16363 он не позволял писать.
По ссылке в комментариях выше об этом упоминается.
По сути монитор был аналогом современного bios boot loader или grub, но более низкоуровневым и интерактивным.
Точно так же было на Apple II и его советском клоне «Агат».
Так что поиск должен завершиться результатом в виде списка этих системных подпрограмм (адреса вызова, интерпретация регистров).
Недавно только узнал, что Лианозовский элекромеханический завод в начале девяностых выпускал Спектрумы в корпусе ПЭВМ Микроша. У меня культурный шок.
Где в ZX Spectrum системный монитор? Загадка ПЭВМ Дуэт