Stalker Stealth Monitor

Материал из SpeccyWiki
Перейти к: навигация, поиск
STS debugger.png

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
  1. FEE4 : PC SP IX IY
  2. FEEC : HL DE BC AF
  3. FEF4 : R
  4. FEF5 : I
  5. FEF6 : HL'DE'BC'AF'
  6. FEFE : MemAdr

Подпрограмма вывода числа/метки в режиме показа меток лежит тут: Адрес входа: #FE6C Вход: bc=число для печати

     hl=позиция для печати(не всегда)

Необходимо сохранять: bc,de',ix

Что хранится в #ff00 (BUFFER) не во время дисковых операций:

  1. FF00 - user область при userarea=0; от #FF80 вниз - P_BUFFER для кн."P" (P_BUF_ADR);
  2. FFBE - адреса строк, показанных на экране;
  3. FFFF - портим для HALT при IM2.

Связь с автором

STS6.2 написан Дмитрием Парцырным (STALKER) в сентябре 1997. Его адрес на тот момент: 310002, г.Харьков, ул.маршала Бажанова, д.12, кв.52 (0572)452569

История версий

Исходники были переданы автором Faster'у из TNL, тот отдал их Capry из Stall, а Capry отдал мне (Alone Coder'у). Я передал авторские диски исходников Crank'у из Techno Lab в свободное распространение.