Stalker Stealth Monitor
STalker Stealth Monitor (STS) — теневой монитор-отладчик, написанный Дмитрием Парцырным (Stalker) из Харькова и дорабатывавшийся разными людьми (Иван Рощин, Alone Coder).
Текущая версия 7.4 доработана Alone Coder
Содержание
Отличия STS7.x от STS6.x
- возврат в вызвавшую программу через RET;
- полный #3d13. Не требуется вводить #5cf4 при трассировке загрузчиков. Невозможно запороть диск. Сработает любой способ подключения HDD или рамдиска, поддержанный в TR-DOS;
- поскольку STS7.x основан на STS5.x, то в нём нет поддержки расширенной памяти компьютеров Scorpion, Profi, ATM и др. (есть отдельная сборка под АТМ2);
- есть дизассемблирование! Выходной текст короче, чем он был в v5.x, но его всё равно можно, не отходя от кассы, импортировать в ALASM (версия ALASM должна быть не ниже
4.47fff);
- разрешено использовать 1M по пентагоновскому стандарту;
- резидент сокращён на 3 байта (теперь 31) и не будет портить RAMTOP при размещении по адресу 23698 (резидент STS6.2 вообще не помещается в системных переменных - в нём 46 байт);
- для ALASM есть специальная (плавающая - с каждой версией меняется) точка входа, которая не портит регистровую модель отлаживаемой программы;
- исправлены ошибки с меткой верхней строки, с определением состояния прерываний, с инициализацией дисковода;
- есть русский шрифт (CP866) и его поддержку можно включать и выключать кнопкой Y;
- подсчёта тактов нет;
- версия 7.x занимает только одну страницу памяти, не считая память ниже #DB00 (обычно буфер каталога ALASM'а - ALASM затирал кусок STS6.2, если ассемблирование проводилось до первого выхода в STS), и не требует дискету с оверлеями;
- опрос клавиатуры синхронизирован с прерываниями - не требуются нелепые настройки, курсор движется быстрее;
- в режиме Caps Lock можно вводить маленькие буквы (с Caps'ом);
- автоматически выключает кэш - не повиснет при отладке кэшевых программ;
- не забывает положение курсора после перемещения по каталогу диска (Extend);
- не забывает номер банка после выхода в ALASM и входа обратно;
- правильно ставит параметры бейсик-файлов при сохранении с расширением .B;
- все регистры видны на одном экране, не нужно переключать наборы регистров;
- области пользователя нет, используется память #ff00, которая уничтожается при работе с диском;
- нет кнопки SETUP - переключение дисководов теперь по ss1, а переключение ПЗУ (Basic/DOS) по кнопке E;
- есть исходник с настройками, в котором вы можете включить какие-нибудь из выброшенных функций (например, подсказки, память пользователя или звук) и перекрасить окошки по своему вкусу.
Управление курсором
CURSOR ([CS+5/6/7/8/9])
[cs+3] - Page Up - страница вверх
[cs+4] - Page Down - страница вниз
[ss+8] - скроллинг текста вверх
[ss+9] - скроллинг текста вниз
Режим редактирования
CURSOR ([cs5]-влево, [cs8]-вправо)
[cs+6] - курсор вниз на строку
[cs+2] - CAPS LOCK - режим больших букв
[cs+0] - BACKSPACE - забой
[Break] - CANCEL - отмена
[ENTER] - ввод
Управление панелями
[cs+1] - переключить экраны
[ss+3] - перекл. Dec/Hex
[ss+4] - перекл. Disasm/List(дамп)
[ss+5] - вкл/выкл показ меток. Анализируется содержимое первой страницы меток ALASM (при входе из ALASM в STS записывается номер страницы и адрес начала меток ALASM). Если меток больше 16k, то ничего не получится!
[cs+ss] - режим каталога диска. Вызываются все дисковые команды (смена дисковода, запись/чтение файла, запись/чтение сектора), при этом имя файла автоматически копируется с позиции курсора. Чтение файла возможно также по клавише <ENTER>.
Команды-окна с параметрами
[Q] - Quit. Перед выходом восстанавливается SP (какой был при запуске STS), IY=#5C3A. Quit To BASIC выходит в бейсик через JP #0058. Из TR-DOS можно вернуться по команде RETURN.
[I] - Fill block. Заполнение участка памяти блоком кодов длиной 1..8 байт, символ "▒" используется для определения конца блока, передвигается с помощью ввода новых символов и DELETE ([cs+0]). Резидент восстанавливается, его можно затирать.
[O] - Copy block. Резидент не восстанавливается!
[L] - Load file. После ввода имени файла STS читает каталог диска, определяет наличие файла, и если таковой имеется, выдает в строках Start и Len информацию о файле (старт и длина) из каталога.
[S] - Save file. Для перезаписи файла на старое место после ввода расширения файла нажмите не [ENTER], а [ssENTER] и удерживайте [ss] примерно 1 секунду. Файл перезапишется на старое место из памяти - с адреса и с длиной согласно каталогу.
[ss+L] - Load sectors, [ss+S] - Save sectors. STS может правильно прочитать/записать не только TR-DOS сектора, но и 1 сектор MS-DOS, IS-DOS и других систем, у которых длина сектора не равна 256 байтам. #3d13 этому не мешает. Резидент восстанавливается, его можно затирать, но нельзя затирать переменные TR-DOS. Также нельзя нажимать Break.
[R] - Set Resident address. По умолчанию=23698.
[B] - Set Bank. Значение для порта 32765=#7FFD. Описание битов порта #7FFD:
0,1,2 - переключение страницы ОЗУ в фирменном ZX Spectrum 128 3 - номер активного экрана 4 - номер ПЗУ: 0=Basic128, 1=Basic48 5 - защелка порта, 1=48k компьютер. Для Pentagon 1M - ещё один бит номера банка. 6,7 - дополнительные биты номера страницы ОЗУ для расширений 512k/256k(Pentagon), в фирменном 128-ом не используются. 7-й бит также поддерживается компьютером KAY1024, за счёт этого KAY1024 тоже может полноценно работать с STS7.x, лежащим вне основных страниц ОЗУ.
[ss+1] - Выбрать дисковод. От A до D.
[M] - Set MemAdr. Установка адреса, с которого будет выводиться информация в панели.
[F] - Find. Поиск блока байтов, текста или команды Z80 по 'AND' маске: байты из памяти маскируются, т.е. биты с маской 1 остаются, с маской 0 - выключаются и сравниваются с маскированным значением в "bytes". (Inverse - поиск до первого НЕсоответствующего байта.) Если последовательность не найдена во всех 64K памяти с текущим Bank, то BORDER будет красным.
Команды без параметров
[N] - find Next. Продолжение поиска с позиции курсора. Если панель находится в режиме List, то строка будет найдена точно в позиции курсора. В режимах Disasm такой точный поиск сработает только верхней строке панели (из-за различной длины команд Z80).
[ss+M] - MemAdr=PC. Переходим туда, где в данный момент "застыл" виртуальный процессор Z80.
[P] - MemAdr=адрес, упоминаемый в тексте, где стоит курсор.
Примеры:
1) курсор стоит на регистре HL #E234; жмем [P]=> перейдем на #Е234;
2) курсор на команде LD IX,#8456; жмем [P]=> перейдем на #8456.
[ss+P] - Return to old MemAdr. Вернуться назад после перехода по кнопке [P]. STS помнит 32 последних перехода.
[A,1/2/3/4/5] - запомнить MemAdr. Нажать [A], отпустить, нажать номер ячейки: от 1 до 5 (по умолчанию в этих ячейках адреса #6000, #8000, #c000, #5d3b и #5cf4 соответственно).
[1/2/3/4/5] - MemAdr=запомненный Adr.
[ss+N] - DumpAdr(адрес ячеек, светящихся вверху экрана)=SP
[V] - DumpAdr=cursor
[Z] - PC=cursor
[E] - переключение ПЗУ (BASIC/DOS). В ПЗУ TR-DOS команды OUT/IN, а также команды, читающие само ПЗУ TR-DOS, не эмулируются!
Команды отладки
[W] - Write break point. Поставить точку останова (3 байта). Когда отлаживаемая программа дойдёт до этой точки, она возвратится через Резидент в STS и восстановит эти 3 байта как было. Не использует Stack. Одновременно можно поставить только одну точку! После Quit в Монитор можно вернутся не только через #db00, но и через Break Point.
[ss+K] - Jump to PC with Screen 1
[ss+J] - Jump to PC with Screen 0
[ss+Z] - Step command. Выполнение текущей команды Z80.
[ss+X] - Step command with Run CALL. То же самое, но команды CALL запускаются из Resident'а. Эту команду, в отличие от следующей, можно выполнять в ПЗУ.
[ss+T] - Run+Break. После текущей команды ставится Breakpoint, после чего STS смело прыгает в эту команду. Так можно делать только в ОЗУ.
[U] - Перейти к памяти User'а в банке STS. Изначально там RET'ы.
[ss+U] - Call User subroutine. Вызов того, что вы там написали.
[J] - Jump Adr. При запуске устанавливается 0-й экран. Возврат в STS - через точки останова.
[C] - Call Adr. То же, но возврат - через RET. Отлаживаемая программа не должна использовать область памяти Резидента.
[Т] - Trace. Окно трассировки в пошаговом режиме:
GO - начало трассировки; Indicate - с индикацией/без нее (без индикации включается 0-й экран); ReDisasm - с перерисовкой панели после каждой команды или без; Stop if Dos - останов при переходе к TR-DOS. При входе автоматически включается просмотр TR-DOS; при выходе - отключается; Stop if Find - останов по заданной в Find команде, Inverse не работает; Stop if User - при отладке каждой команды запускается подпрограмма пользователя из области User'а (см.про [U]). Если она возвращает NZ (или ничего не меняет), то продолжается
трассировка, иначе останов. Примеры использования этой навороченной функции:
1) Необходимо остановиться, когда в ячейке (#7345) будет #34: [U], вводим подпрограмму:
LD A,(#7345) CP #34 RET
2) Необходимо остановиться, когда в HL=#1243: [U], вводим подпрограмму:
LD HL,(#FEEC) ;(см.ниже про адреса регистров) LD DE,#1243 AND A SBC HL,DE RET
Stop on Adr - остановка на адресе; Trace Bank - вкл./выкл. обработки команд вывода в порт #7ffd (проверяются 1-й и 15-й разряды адреса). При выкл. они не будут переключать память, при вкл. - будут; Trace Call - вкл./выкл. трассировки команд CALL. При вкл.отладчик заходит 'внутрь' процедуры ([ssZ]), при выкл. - запускает ([ss+X])
[D] - Disasm To Disk. Дизассемблирование на Диск. В первом окошке указываете:
Start - адрес начала дизассемблируемой области памяти. End - адрес её конца (включительно! в Copy и Fill - тоже). End не должен быть равен #FFFF=65535.
Во втором окошке:
Start - начало локального блока, вычисляется автоматически. End - адрес конца локального блока. Disasm/DEFB N - дизассемблер/дамп памяти (по N байт в строке).
Дизассемблирование происходит в два прохода. На первом создается таблица меток (используется буфер #c000-#daff в странице STS'а), на втором собственно и происходит дизассемблирование с выгрузкой на диск (буфер организуется по адресу #4000).
Дополнительная информация
При запуске STS из 7-й страницы используется 1-й экран, иначе 0-й.
Некоторые ошибочные ситуации отображаются изменением цвета BORDER'а: красный - последовательность не найдена в 64К памяти (команда Find) или Disk Error (не для #3d13 версии!); фиолетовый - неправильно введены мнемоники ассемблера. Расстояние между командой и ее операндами (данными) должно равняться 1 пробелу; число цифр в HEX числе должно быть строго 2 или 4, смотря по команде; команды типа RES 5,A,(IY+1) не ассемблируются; голубой - нет места на диске;
Резидент - блок кодов переменного содержания, но с постоянной длиной в 31=#1F байт (для STS7.0), размещается в области #4000..#BFFF (для 48k - в любой области). Резидент используется монитором для доступа к любой странице памяти (Bank). Резидент динамически изменяется и восстанавливается (не всегда, см. примечания к командам). При перемещении Резидента восстанавливается память, бывшая "под ним". Перед дисковыми функциями восстанавливается память "под Резидентом",а после - заново запоминается. При запуске STS память под Резидентом запоминается, при QUIT она не восстанавливается.
Расположение значений регистров Z80 в STS:
+0 +2 +4 +8
- FEE4 : PC SP IX IY
- FEEC : HL DE BC AF
- FEF4 : R
- FEF5 : I
- FEF6 : HL'DE'BC'AF'
- FEFE : MemAdr
Подпрограмма вывода числа/метки в режиме показа меток лежит тут: Адрес входа: #FE6C Вход: bc=число для печати
hl=позиция для печати(не всегда)
Необходимо сохранять: bc,de',ix
Что хранится в #ff00 (BUFFER) не во время дисковых операций:
- FF00 - user область при userarea=0; от #FF80 вниз - P_BUFFER для кн."P" (P_BUF_ADR);
- FFBE - адреса строк, показанных на экране;
- FFFF - портим для HALT при IM2.
Связь с автором
STS6.2 написан Дмитрием Парцырным (STALKER) в сентябре 1997. Его адрес на тот момент: 310002, г.Харьков, ул.маршала Бажанова, д.12, кв.52 (0572)452569
История версий
Исходники были переданы автором Faster'у из TNL, тот отдал их Capry из Stall, а Capry отдал мне (Alone Coder'у). Я передал авторские диски исходников Crank'у из Techno Lab в свободное распространение.