Системные программы для ZX Spectrum 1993 г.

Монитор-отладчик MON2 - просмотр памяти и вывод данных. Поиск последовательности байт.


В процессе работы некоторых команд Моп2 (ASCII, TRACE,
DISAS) информация на экран выводится «порциями». В этом слу-
чае, чтобы вывести на экран очередную строку информации нужно
нажать любую клавишу, кроме Enter и Р. Нажатие Enter выводит
сразу несколько строк. Нажатие и удержание любой клавиши
обеспечит постоянный вывод информации. Тем же, у кого не
хватает сил удерживать кнопку в нажатом состоянии, посоветуем
один раз надавить на клавишу Р. При этом вывод информации на
экран будет происходить непрерывно до нажатия любой клавиши.
Вывод прервется также при превышении конечного адреса выпол-
нения команды, заданного соответствующим параметром, или при
нажатии клавиш CS/1 (Edit).

Во время выполнения команд ASCII, EDIT, DISAS и TRACE можно
изменять текущий адрес, то есть изменять «точку приложения» этих
команд. Изменение текущего адреса осуществляется клавишами:

CS/7 — уменьшение текущего адреса на единицу;

CS/6 — увеличение текущего адреса на единицу;

CS/5 — уменьшение текущего адреса на 8 (при работе в

шестнадцатеричной системе), на 10 (в десятичной);

CS/8 — увеличение текущего адреса на 8 (при работе в

шестнадцатеричной системе), на 10 (в десятичной);

SS/A — установка текущего адреса.

При вводе комбинации SS/A (в режиме EDIT следует нажимать
SS/A+Enter) в начале текущей строки появляется подсказка А:, в
ответ на которую нужно ввести необходимый адрес и нажать Enter.

По этой команде на экран выводится содержимое ячеек памяти,
начиная с адреса addrl и по адрес adclr2 (рис. 49). В каждой
экранной строке выводятся: адрес первой из 4 или 5 ячеек (в
зависимости от системы счисления, см. команду HEX/DEC), значе-
ния этих ячеек и их символьные эквиваленты. Кодам от 32 (#20)*

до 127 (#7F) соответствуют их ASCII-эквиваленты. Для кодов
меньше 32 (#20) выводятся знаки вопроса. Если код больше
127 (#7F), то он будет представлен ASCII-символом, соответствую-
щим коду со сброшенным старшим битом. Так например, код 161
(#А1), если сбросить его старший бит, превратится в код 33 (#21),
которому соответствует ASCII-символ ! (восклицательный знак).

Система счисления, в которой будет отображаться содержимое
ячеек — десятичная или шестнадцатеричная — меняется командой
HEX/DEC (см. ниже).

Команду ASCII обычно используют для быстрого просмотра дан-
ных (хотя некоторые умудряются просматривать таким образом и
программы, дизассемблируя их в голове).

Во время просмотра памяти клавишами CS/7, CS/6, CS/5, CS/8 и
SS/A можно менять текущий адрес (см. стр. 187).

Выход в режим ввода команд происходит при достижении адреса
addr2 или после нажатия клавиши Edit.

При запуске монитора устанавливается десятичная система
счисления для ввода и вывода данных*. При выполнении команды
HEX/DEC монитор переключается на шестнадцатеричную систему.
Для обратного перехода нужно выполнить команду еще раз.

К сожалению, нигде не индицируется, в какой системе счисле-
ния в данный момент происходит ввод/вывод. Для определения
текущей системы счисления можно выполнить команду DISAS (см.
ниже), при выполнении которой шестнадцатеричные числа выво-
дятся со значком #.

После запуска монитора для вывода информации используется
весь экран. Однако, часто возникает необходимость ограничить
область вывода (например, если отлаживаемая программа работает
с экраном или сама размещается в экранной области памяти).

Команда WIND позволяет задать окно вывода — часть экрана,
куда будет осуществляться вывод информации. Ширина окна рав-
на ширине экрана (32 знакоместа), а номера верхней и нижней
экранных строк, ограничивающих окно, задаются параметрами
у1 и у2.

Эта команда только задает размеры и положение окна. За вклю-
чение/выключение окна отвечает команда с тем же названием
WIND, но вызываемая клавишей V (см. след. команду).

Выполнение этой команды с параметром flag = 1 переключает
вывод информации в окно, размеры и расположение которого
заданы командой, вызываемой клавишей W (см. пред. команду).

При выполнении команды с параметром flag = 0 окно выключа-
ется, то есть вывод информации будет осуществляться на весь
экран.

При отключенном окне вывода команду WIND § можно исполь-
зовать для очистки всего экрана. Выполнение команды WIND 1 при
включенном окне приведет к его очистке.

Пример:

В примере мы используем некоторые команды, которые будут
описаны позже, но для понимания сути вполне достаточно взгля-
нуть на рис. 50.

Предположим, что в памяти, начиная с адреса 23296 (#5В00),
находится следующая программа, которая выводит на экран кар-
тинку:

5В00 LD HL,#9C40 ; с адреса 40000 (#9С40) находится картинка;

5B03 LD DE,#4000 ; 16384 (#4000) - начало экранной области;

5B06 LD ВС, #1800 ; 6912 (#1800) - длина картинки;
5B09 LDIR ; переписываем картинку на экран;

5В0В RET ; возвращаемся из процедуры.

Если задать окно вывода, то при отладке программы картинка
пострадает только частично (рис. 50):

WIND from 13 to 20 (клавиша W)

WIND 1 (клавиша V)
HEX/DEC

GOSUB 5BOO (cm. G GOSUB)

TRACE from 5BOO to 5BFF (cm. T TRACE)

FIND from addr
01 .BYTE bytel
MASK maskl
02.BYTE byfe2
MASK mask2

NN.BYTE byteN

MASK maskN

addr — адрес начала поиска

byteN — N-и байт искомой последовательности

maskN — маска N-ro байта искомой последовательности

0(#0000) <; ector<;65535(#FFFF)

0(#00)<>(byteN; m#sM)<255(#FF)

По этой команде в памяти, начиная с адреса addr, осуществляет-
ся поиск последовательности байт bytel, byte2.....byteN. Для каждо-
го байта последовательности можно задать байт-маску — maskl,
mask2, ..., maskN. Значения битов, указанных в маске, при поиске
заданного байта будут игнорироваться. Допустим, мы задали поиск
байта #00 (двоичное представление байта — %00000000) и ввели
для него маску #03 (%00000011). Тогда Моп2 будет искать все
байты, в которых биты 2...7 сброшены, а 0-й и 1-й — любые
(установлены или сброшены), то есть будет «объявлен розыск»
байтов #00, #01, #02 и #03. Если вы не хотите вводить маску, то
на запрос MASK отвечайте нажатием Enter.

Если при вводе последовательности на запрос очередного байта
BYTE вы, ничего не набирая, нажмете Enter, это будет сигналом к
началу поиска последовательности. В случае нахождения искомой
последовательности адрес ее начала выводится на экран, и при
нажатии Enter поиск продолжается со следующего адреса до тех
пор, пока не будет нажата клавиша Edit.

Пример:

Допустим, мы хотим найти все команды типа SET N,(IY+ZZ), где
N — номер бита, a ZZ — смещение. Коды этих команд можно
описать такой «формулой»:

#FD#CB#ZZ#NN

-где ZZ — любое число от 0 до 255, а NN может принимать
значения С6, СЕ, D6, DE, Е6, ЕЕ, F6, FE (см. [1], «Таблица сим-
волов»).

Теперь зададим для поиска код, например, #FD#CB#02#C6
(команда SET 05,(IY+02)), но замаскируем в нем байты #02 и #С6
масками #FF и #7Е соответственно (рис. 51). Это как раз и
позволит найти все последовательности (команды типа SET N,
(IY+ZZ)), заданные «формулой».

6 этом режиме в начале каждой экранной строки выводится
адрес addrl, через пробелы — содержимое ячейки памяти и ASCII-
эквивалент (см. команду ASCII). Затем следует тире, после которого
вы должны ввести новое значение ячейки. Возможны три варианта
действий:

• вы вводите непосредственно новое значение, нажимаете Enter,
после чего автоматически переходите к редактированию сле-
дующей ячейки;

• вы сразу нажимаете Enter. В этом случае в текущую ячейку
записывается ноль и вы автоматически переходите к редакти-
рованию следующей;

• вы вводите кавычки ("), после которых набираете один или
несколько ASCII-символов. Закрывающую кавычку вводить
не следует. После нажатия Enter символ или строка будут
размещены в памяти, а текущий адрес редактирования увели-
чится на количество введенных символов.

В режиме EDIT можно менять текущий адрес клавишами CS/7,
CS/6, CS/5, CS/8. В отличие от других режимов прямая установка
текущего адреса производится нажатием комбинации клавиш
SS/A+Enter (см. стр. 187).

Пример работы в режиме EDIT приведен на рис. 52.

Выход в режим ввода команд происходит при нажатии клавиши
Edit (CS/1).

По этой команде во все ячейки памяти с адреса addrl по addr2
записывается байт byfe. Команда FILL, введенная без параметра
byte, по умолчанию заполняет заданную область нулями. Будьте
осторожны: выполнение команды FILL без параметров или только с
одним параметром зачастую приводит к непредсказуемым по-
следствиям.

По этой команде содержимое ячеек памяти с адреса addrl по
addr2 копируется в область памяти, начиная с адреса addr3
(рис. 53). Допускается копирование с перекрытием исходного бло-
ка, то есть копия блока может располагаться поверх оригинала.

Команду MOVE обычно применяют для копирования таблиц,
текстов и прочих данных. Для копирования программ лучше ис-
пользовать команду RELOC (см. ниже).

>DISRS from 2024 to 22RR

defb гго»

2024. CALL «21F2

2027 RET NC

2028 CRLL 82070
202B RET NC
202C CRLL 824-ГВ
202F CRLL. R1FC3
2032 BIT «06, ( IY+»01)

> MOUE from 2024. to 22RR to C350

>DISAS from C350 to FFFF

DEFB from

C350 CRLL t*21F2

C3B3 RET NC

C354. CRLL «2070

C3S7 RET NC

C388 CRLL «24FB

C35B CRLL «1FC3

C35E BIT «06, (IY+»01)

C362 CRLL Z,tt2BFl

Рис. 53. Команде MOVE.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
What's next? - Следующий номер Buzz'a выйдет?
Раскрутка - Описание и рекомендации по прохождению игры MAGICIAN LAND.
Реклама - ГАЗЕТЕ SKY NET ТРЕБУЮТСЯ РЕДАКТОРЫ РАЗДЕЛОВ!
История - О западном журнале Sinclair User 1982-1993.
BBS на ZX - О развитии BBS'ок на Speccy.

В этот день...   21 ноября