Adventurer
#08
31 августа 1998 |
|
Презентация - HELP Z_80: Руководство пользователя.
(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" и т. д.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября