(C) Иван Рощин, 9. 04. 1997.
╔════════════════════════════╗
║ ║░
║ HELP_Z80 (beta-version) ║░
║ ║░
║ Руководство пользователя ║░
║ ║░
╚════════════════════════════╝░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
┌──────────┐
│ Введение │
└──────────┘
HELP_Z80 - это бесплатная
(freeware), не имеющая аналогов утилита,
которая представляет собой электронный
справочник по командам микропроцессора
Z80. С его помощью можно узнать мнемонику
( и ее смысл ), кодировку, влияние на
флаги и время выполнения для каждой ко-
манды процессора, а также другую полезную
информацию. HELP содержит описание 1136
команд, в том числе и недокументирован-
ных, занимает в памяти около девяти кило-
байт и может работать на ZX SPECTRUM
48... 512K. Бета-версия программы отли-
чается от полной лишь тем, что для команд
Z80 не указываются соответствующие им ма-
шинные коды.
┌───────────────────┐
│ Загрузка и запуск │
└───────────────────┘
В простейшем случае для запуска
HELP'а достаточно ввести команду TR-DOS:
RUN "HELP_Z80"
Эта команда запускает Бейсик-загруз-
чик, который выполняет следующие дейст-
вия:
-если запуск произведен из режима
128K, компьютер переходит в режим 48K с
открытыми страницами;
-в седьмую страницу памяти загру-
жается файл "help_z80";
-управление передается на адрес
56064 = #DB00.
HELP может быть загружен и в любую
другую страницу памяти, но для этого при-
дется либо переписать загрузчик, либо вы-
полнить соответствующие действия вручную.
Приведу несколько примеров:
а) BASIC. Загрузка в 1-ю страницу:
RANDOMIZE USR 0
CLEAR 24999
OUT 32765, 17
RANDOMIZE USR 15616
LOAD "help_z80" CODE
RANDOMIZE USR 56064
Повторный запуск:
OUT 32765, 17: RANDOMIZE USR 56064
б) STS. Загрузка в 1-ю страницу:
[B] #11
[L] help_z80, #DB00, #2500
[J] #DB00
При использовании STS версии 5. 0 и
выше можно запускать HELP с помощью ко-
манды [C] #DB00. В этом случае после вы-
хода из HELP'а произойдет возврат в STS.
в) Запуск уже загруженного в 1-ю
страницу HELP'а из программы на ассембле-
ре:
LD BC, #7FFD
LD A, #11
OUT (C), A
CALL #DB00
┌──────────────────┐
│ Работа с HELP'ом │
└──────────────────┘
После появления небольшого сообщения
с названием программы и сведениями об ав-
торе нажмите любую клавишу, и вы увидите
основной экран программы:
┌───────────────────────────────────────┐
│ │
│ Система команд процессора Z80 │
│ │
│ Условные обозначения │
│ │
│ - флаг не изменяется; │
│ флаг устанавливается в соответствии │
│ с результатом операции; │
│ 1 флаг включается; │
│ 0 флаг выключается; │
│ ? флаг неопределен; │
│ P флаг переполнения/четности работает │
│ как флаг четности; │
│ V флаг переполнения/четности работает │
│ как флаг переполнения; │
│ │
│Для некоторых команд в колонке t указа-│
│но два значения: │
│ │
│-для условных команд JR,CALL,RET второе│
│ значение -это количество тактов при │
│ ВЫПОЛНЕНИИ условия. │
│ │
│-для "цикличных" команд (DJNZ, LDIR,..)│
└───────────────────────────────────────┘
Имеется возможность просматривать
информацию, как обычный текст, используя
управляющие клавиши:
[CS+6], [CS+7] (CURSOR) -перемещение
на строку вниз и вверх;
[CS+3] -PageUp;
[CS+4] -PageDown;
[CS+1] (EDIT) -переключение экранов
( как в STS ). Действует,
только если HELP использует второй
экран. Эту функцию удобно использовать,
если HELP загружен вместо STS и вызывает-
ся из ассемблера. При этом можно "однов-
ременно" видеть исходный текст программы
и информацию о командах Z80.
[Q]-выход из HELP'а (в ассемблер или
в вызывавшую программу). При выходе восс-
танавливается состояние процессора на мо-
мент запуска HELP'а (см. раздел "Систем-
ная информация"). Чтобы выйти в ассемб-
лер, HELP устанавливает 4 страницу памяти
и выполняет команду JP #C000. При этом
портятся значения регистров A, B, C, а
также пять байтов памяти с адреса #57E0
(впрочем, это не имеет особого значе-
ния).
В некоторых случаях, во избежание
неприятностей, вместо выхода в ассемблер
произойдет выход в вызывавшую программу.
Выход в ассемблер невозможен, если:
- ассемблер не загружен (по адресу
#C000 находится 0);
- HELP запущен в режиме 48K;
- HELP находится в 4 странице;
- стек располагается выше 25000.
При нажатии комбинации клавиш
[CS+SS] (EXT. MODE) активизируется режим
Command, в котором действуют следующие
клавиши:
[CS+7] (стрелка вверх) -переход к
началу текста;
[CS+6] (стрелка вниз) -переход к
концу текста;
[Q] -альтернативный способ выхода из
HELP'а;
[S] - поиск информации о какой-либо
команде процессора.
Необходимо ввести мнемонику команды
в таком же виде, в каком она представлена
в тексте HELP'а (можно указать лишь нес-
колько первых символов). Если команда бу-
дет найдена, информация о ней появится в
верхней строке экрана, иначе HELP просиг-
нализирует изменением цвета бордюра.
Поиск всегда начинается с той строки
HELP'а, которая находится вверху экрана,
и продолжается циклически. В любой момент
его можно прервать нажатием клавиши
BREAK.
Пример: поиск информации о команде
LD L, N
┌───────────────────────────────────────┐
│▒▒▒Command: Search LD L,N ▒▒▒▒▒▒▒▒▒▒▒▒▒│
│ Система команд процессора Z80 │
│ │
│ Условные обозначения │
│ │
│ - флаг не изменяется; │
...................................
└───────────────────────────────────────┘
После завершения поиска:
┌───────────────────────────────────────┐
││LD L,N │2E N │- - - -│7 ││
│├───────────┼───────────┼──────────┼──┤│
││LD HX,N │DD 26 N │- - - -│11││
││LD LX,N │DD 2E N │- - - -│11││
││LD HY,N │FD 26 N │- - - -│11││
││LD LY,N │FD 2E N │- - - -│11││
...................................
└───────────────────────────────────────┘
С помощью этой же функции можно уз-
нать, каков смысл той или иной мнемоники
ассемблера. Для этого нужно перейти к на-
чалу текста и указать в качестве строки
для поиска нужную мнемонику.
Пример: поиск информации о мнемонике
LD
┌───────────────────────────────────────┐
│▒▒▒Command: Search LD ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│
│ Система команд процессора Z80 │
│ │
│ Условные обозначения │
│ │
│ - флаг не изменяется; │
..................................
└───────────────────────────────────────┘
После завершения поиска:
┌───────────────────────────────────────┐
│ LD - LoaD │
│┌───────────┬────────┬─────────────┬──┐│
││ │ │ Флаги │t ││
││Мнемоника │ Код ├─────────────┤ ││
││ │ │C Z P/V S N H│ ││
│├───────────┼────────┼─────────────┼──┤│
││LD A,N │3E N │- - - - - -│7 ││
...................................
└───────────────────────────────────────┘
[M] -вся справочная информация запи-
сывается в область памяти с адреса
#6000=24576 в обычном текстовом формате.
Эта функция может пригодиться, если вы
захотите записать содержимое HELP'а в
текстовый файл, например, для последующей
печати.
Так как текст очень велик по объему
(1670 строк, более 66K), он будет разбит
на три части, и при каждом вызове функции
в памяти сформируется очередная часть.
При этом на экран выводится сообщение ви-
да:
Command:
Making part 1, 24576, 23936
Первое число обозначает адрес начала
текста, а второе его длину. Для записи
текста на диск можно использовать средст-
ва TR-DOS или STS.
┌────────────────┐
│ HELP_Z80 + ASM │
└────────────────┘
Вы можете загрузить HELP в любой ас-
семблер вместо отладчика STS. Например, в
ассемблере "ZX ASM 3. 0", которым я поль-
зуюсь, имеется опция "Load sts". При ее
выборе нужно указать имя файла, который
будет загружен в качестве отладчика. Мож-
но указать имя "help_z80", поработать с
HELP'ом, а потом, если нужно, загрузить
STS и работать с ним. В других ассембле-
рах (TASM, MASM, ALASM) такой полезной
опции нет, так что в этом случае придется
или переименовать файл "help_z80", ска-
жем, в "sts5. 1a", или загружать HELP
вручную. Что поделаешь, нет еще такого
ассемблера, который бы полностью поддер-
живал все возможности HELP'а, но будем
надеяться, что это временное явление.
┌──────────────────────┐
│ HELP_Z80 + ASM + STS │
└──────────────────────┘
Если в памяти есть свободное место,
можно одновременно разместить в ней и ас-
семблер, и отладчик, и HELP. В этом слу-
чае можно вызывать HELP из Бейсика или из
STS так, как это было указано в разделе
"Загрузка и запуск". Можно также написать
User-функцию для STS и вызывать HELP с ее
помощью (см. пример).
Для пользователей ассемблера ZX ASM
3. 0 могу посоветовать разместить HELP в
3 банке памяти, при этом у вас останется
возможность использования STS. Учтите,
что часть этого банка, ограниченная вели-
чиной Pool size, используется для подг-
рузки с диска при компиляции. Чтобы HELP
не оказался затертым, необходимо устано-
вить Pool size=7168 байт. Если исполь-
зуется двойная вложенность текстов, эту
величину придется уменьшить еще вдвое (до
3584 байт).
Пример User-функции для вызова
HELP'а в случае, когда STS находится в 7
странице, HELP в 3-й, а резидент распола-
гается по адресу #5B90:
LD HL,HLP_RES
LD DE,#5B90;адрес резидента STS
LD BC,14 ;его длина
LDIR ;устанавливаем новый
;резидент
LD BC,#7FFD
LD HL,#1B1F ;банки памяти
LD (#5B9B),SP;сохранили SP
JP #5B90 ;вызов резидента
HLP_RES OUT (C),H ;установили банк
;HELP'а
LD SP,#0000 ;новое значение SP
;(чтобы запомнить адрес возврата)
CALL #DB00 ;вызвали HELP
OUT (C),L ;установили банк STS
LD SP,#0000 ;восстановили старое
;значение SP
RET ;и вернулись в STS.
Более короткий вариант этой функции
для STS 5.1:
#FE2A: LD HL,#FE33 ;Установили адрес.
CALL #E354 ;Эта подпрограмма
;установит резидент,
JP #E33D ;а эта-запустит его.
;Этот фрагмент будет работать на адресах #5B90-#5BA4:
#FE33: LD HL,#1B1F ;это номера банков
;памяти
LD (#5BA2),SP;сохранили SP
OUT (C),H ;установили банк
;HELP'а
LD SP,#0000 ;новое значение SP
;(чтобы запомнить адрес возврата)
CALL #DB00 ;вызов HELP'а
OUT (C),L ;установили банк STS
LD SP,#0000 ;восстановили старое значение SP
RET ;и вернулись в STS.
┌──────────────────────┐
│ Системная информация │
└──────────────────────┘
Представленные в этом разделе сведе-
ния будут полезны как простому пользова-
телю, так и тому, кто захочет написать
(или переделать) ассемблер или отладчик
для того, чтобы в полной мере использо-
вать возможности HELP'а.
┌──────────────────────┐
│ Распределение памяти │
└──────────────────────┘
Как вы уже могли заметить, по расп-
ределению памяти HELP очень похож на ши-
роко известный отладчик STS. Это сделано
специально для того, чтобы обеспечить
удобное использование HELP'а совместно с
ассемблером. HELP может располагаться в
любой странице ОЗУ с адреса #DB00=56064 и
занимает #24FE байт до адреса #FFFD (пос-
ледние два байта не используются).
Поддерживается расширение памяти до
512K с помощью порта #7FFD.
Определение собственного местонахож-
дения и используемого экрана происходит
при каждом запуске HELP'а, поэтому имеет-
ся возможность свободно перемещать его из
одной страницы памяти в другую. Возможно
наличие в памяти нескольких копий
HELP'а.
Если HELP загружен в 7 страницу или
при запуске он обнаружил, что в 7 страни-
це находится STS, для вывода информации
будет использоваться второй экран, иначе
стандартный.
У вас может возникнуть вопрос: а как
же HELP узнает, есть в 7 странице STS или
нет ? Дело в том, что в любой версии STS
содержится строка символов "SZ5", которую
и ищет HELP.
┌────────────────────┐
│ Особенности работы │
└────────────────────┘
При запуске HELP'а по адресу #DB00
происходит следующее:
- запоминается SP, после чего стек
переустанавливается;
- сохраняются значения всех регист-
ров процессора;
- проверяется режим работы прерыва-
ний (разрешены/запрещены), после чего они
запрещаются;
- проверяется, какое ПЗУ подключено,
после чего подключается 48-е ПЗУ.
При выходе из HELP'а все возвращает-
ся на свои места:
- включается стандартный экран (если
HELP был запущен в полноэкранном режи-
ме);
- подключается ПЗУ, которое было на
момент запуска;
- восстанавливаются значения регист-
ров,включая SP,и режим работы прерываний.
Определение подключенного ПЗУ проис-
ходит так же, как и в одной из процедур
TR-DOS, на основе анализа содержимого
ячейки памяти по адресу 949. Если в ней
содержится число 243, считается, что
подключено 48-е ПЗУ, иначе 128-е.
HELP не портит значение ни одной
ячейки памяти, исключая самого себя и эк-
ранную область. Таким образом, он пол-
ностью автономен.
Значение регистра R после окончания
работы HELP'а (т. е. после выполнения ко-
манды RET) будет на 1 больше того, кото-
рое было сразу после его запуска (т. е.
после выполнения команды CALL #DB00). Та-
ким образом, после выполнения любой из
двух указанных ниже команд содержимое R
будет одинаковым (по адресу #0052, как
известно, находится просто RET):
1. CALL #DB00 2. CALL #0052
Это сделано для того, чтобы после
запуска HELP'а из STS с помощью команды
[C] содержимое регистров отлаживаемой
программы не изменилось. Впрочем, при та-
ком запуске изменяются два байта из стека
отлаживаемой программы (в них STS запоми-
нает адрес возврата).
┌────────────────────────────┐
│ Дополнительные возможности │
└────────────────────────────┘
Возможности HELP'а не ограничиваются
простым просмотром справочной информации.
Представьте себе, например, такую ситуа-
цию: вы набираете программу на ассемблере
и изучаете ее с помощью отладчика. Кур-
сор установлен на какой-либо команде. Вы
нажимаете определенную комбинацию клавиш,
и на экране появляется окно со справочной
информацией по этой команде. Для пользо-
вателей IBM PC это привычный стиль рабо-
ты, а вот на Speccy я ничего подобного не
видел.
Конечно, чтобы использовать эту воз-
можность, нужно внести существенные изме-
нения в ассемблер и/или отладчик. Вот все
необходимые сведения по используемой для
этой цели точке входа с адресом #DB02:
При вызове процедуры по адресу #DB02
на экране будет построено окно с информа-
цией о требуемой команде, после чего уп-
равление будет возвращено вызывавшей
программе. Сохранение содержимого экрана
под окном не производится, атрибуты также
не устанавливаются, так что об этом долж-
на позаботиться вызывающая программа.
После вызова этой процедуры, в отличие от
точки входа #DB00, регистры AF, B, DE из-
менят свои значения. Возможна такая си-
туация, когда HELP не смог найти нужную
информацию, например, из-за некорректного
задания строки с мнемоникой команды. В
этом случае будет выведена надпись "Not
found".
Параметры:
IX - указывает на строку с текстом
команды, справку по которой нужно полу-
чить. Строка заканчивается нулевым байтом
и должна располагаться в памяти ниже
#C000.
A - указывает, на каком экране будет
производиться вывод информации. 0 соот-
ветствует стандартному экрану, 1 второму
экрану.
Текст команды должен указываться с
заданными значениями операндов. Мнемоника
должна отделяться от них одним пробелом,
например, так:
LD HL,( 12345)
ADD A, #87
IM 0
SET 4, A,( IX+31)
Пример: изобразим на основном экране
окно со справочной информацией о команде
EX AF, AF':
LD IX, TEXT
XOR A
CALL #DB02
...
TEXT DB "EX AF, AF'", 0
┌─────────────────────┐
│ Точка входа для STS │
└─────────────────────┘
Эта точка входа, расположенная по
адресу #DB04, предназначена для вывода
на экран справки по команде ассемблера,
на которой стоит курсор в отладчике STS.
В принципе, она выполняет те же действия,
что и #DB02, но при этом специально расс-
читана на то, чтобы вносимые в STS изме-
нения были минимальными и допускали лег-
кую адаптацию любой версии этого отладчи-
ка. От пользователя требуется указать
нужную команду с помощью курсора, два ра-
за нажать ENTER (или нажать ENTER и
BREAK), чтобы войти в режим редактирова-
ния и выйти из него, а потом использовать
комбинацию клавиш [SS+U] для вызова функ-
ции пользователя (которая, в свою оче-
редь, вызовет #DB04). Вызываемая функция
изображает в центре экрана окно с инфор-
мацией о команде, устанавливает атрибуты
(цвет окна такой же, как и цвет листин-
га), ждет нажатия на любую клавишу и
возвращается в STS. После окончания ее
работы значение регистров AF, B, DE будет
изменено.
┌────────────────────────────────────────┐
│ #0000 F3 AF 11 FF FF C3 CB 11 s/▒ccCK▒│
│PC #0000 #0000 F3 DI │
│SP #5FE8 #0001 AF XOR A │
│IX #8685 #0002 11FFFF LD DE,#FFFF │
│IY #5C3A #0005 C3CB11 ▒JP #11CB▒▒▒▒▒▒▒▒│
│HL #C07A #0008 2A5D5C LD HL,(#5C5D) │
│DE #5B45 #000B 225F5C LD (#5C5F),HL │
│BC #7FFD #000E 1843 JR #0053 │
│AF #172C #0010 C3F215 JP #15F2 │
│IR #3F16 #001┌──────────────┐38 │
│ INT #001│JP NN │░8 │
│ 5 3P #001│ │░8 │
│ #001│CZP/VSNH t=10 │░8 │
│ #001│-- - --- │░8 │
│ #001└──────────────┘░(#5C5D) │
│ #001B░░░░░░░░░░░░░░░░HL) │
│ #001C CD7D00 CALL #007D │
│ #001F D0 RET NC │
│ #0020 CD7400 CALL #0074 │
│ #0023 18F7 JR #001C │
│ #0025 FF RST #38 │
│ #0026 FF RST #38 │
│ #0027 FF RST #38 │
│ │
└────────────────────────────────Bank #18┘
Параметры:
IX - указывает на адрес буфера для
редактирования строки в STS. В дальнейшем
будем обозначать этот адрес как BEGIN_S.
В версии STS 5. 1 он равен #FF80.
A - указывает, на каком экране будет
производиться вывод информации. 0 соот-
ветствует стандартному экрану, 1 второму
экрану.
L - номер банка памяти, в котором
находится STS, т. е. число, которое нужно
занести в порт #7FFD для установки этого
банка.
Пример User-функции для вызова
HELP'а в случае, когда STS находится в 7
странице, HELP в 3-й, а резидент распола-
гается по адресу #5B90:
LD IX,BEGIN_S;адрес буфера
LD A,1 ;номер экрана
LD HL,HLP_RES
LD DE,#5B90 ;адрес резидента STS
LD BC,14 ;его длина
LDIR ;устанавливаем новый резидент
LD BC,#7FFD
LD HL,#1B1F ;банки памяти
LD (#5B9B),SP;сохранили SP
JP #5B90 ;вызов резидента
HLP_RES OUT (C),H ;установили банк HELP'а
LD SP,#0000 ;новое значение SP
;(чтобы запомнить адрес возврата)
CALL #DB04 ;вызвали HELP
OUT (C),L ;установили банк STS
LD SP,#0000 ;восстановили старое
;значение SP
RET ;и вернулись в STS.
Обратите внимание : если заменить
адрес #DB04 на #DB00, эта же User -функ-
ция будет вызывать HELP в полноэкранном
режиме.
┌────────────┐
│ Литература │
└────────────┘
1. А. Ларченко, Н. Родионов "ZX
Spectrum и TR-DOS для пользователей и
программистов".
2. ИНФОРКОМ "Программирование в ма-
шинных кодах и на языке ассемблера".
3. А. Евдокимов, А. Капульцевич, И.
Капульцевич "Как написать игру на ассемб-
лере для ZX Spectrum".
4. С. П. Шутов, М. М. Мухаметшин
"Микропроцессор Z-80. Справочное посо-
бие".
5. П. Ю. Федин "Полное описание и
полный дизассемблер ПЗУ TR-DOS 5. 04T (5.
03)".
6. VA PRINT "Ассемблер Z80".
7. Стив Кремер "Операционная система
СПЕКТРУМ".
8. "ZX-РЕВЮ", "SPECTROFON",
"ZX-FORMAT", "ON-LINE" и т. д.