Теневой ассемблер ALASM 3.8с (part 1). .СИСТЕМКИ Теневой макро ассемблер-отладчик ALASM v3.8с Краткое описание функциональных возможностей. Оглавление: 1. РАСПРЕДЕЛЕНИЕ ПАМЯТИ 2. ХOЛOДНЫЙ ЗАПУСК 3. КОМАНДЫ СРЕДЫ АССЕМБЛЕРА 4. КОМАНДЫ РЕДАКТОРА 5. ДИРЕКТИВЫ АССЕМБЛЕРА б. ОШИБКИ КOМПИЛЯТOРА 7. ОПЦИИ МЕНЮ SETUP 8. В СЛЕДУЮЩИХ ВЕРСИЯХ 9. ОТЛИЧИЯ 0Т ПРЕДЫДУЩИХ ВЕРСИЙ ════════════════════════════════════════════════════════════════ 1. РАСПРЕДЕЛЕНИЕ ПАМЯТИ ALASM позволяет работать одновременно с несколькими текстами, расположенными в разных страницах памяти пользователя. Переход от редактирования одной страницы к другой осуществляется вводом команды PAGE [страница] из рабочей строки асемблера. Количество текстов, которые может обрабатывать ALASM, зависит только от объема памяти компьютера. Страницы в ассемблере нумеруются по маске максимального зна- чения, передаваемого в драйвер расширенной памяти. При этом его младшие 3 бита соответствуют битам, передаваемым в порт #7FFD. ──────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────── 2. ХOЛOДНЫЙ ЗАПУСК При запуске ассемблера из TR-DOS экран очищается и на нем по- является авторское вступление, после чего проводится тест памяти по всем восьми битам номера страницы драйвера. Его результаты выводятся на экран в виде ХХХ кб mask ХХ. Числа указывают, сколько памяти доступно ассемблеру на Вашем компьютере и какие биты номера страницы отвечают за доступ. По этим битам мас- кируется операнд команды PAGE и других команд. Ниже теста памяти выводится HELP, содержащий список команд ассемблера и его редактора. Горячие клавиши этих команд вынесены в заглавный режим. Ниже предлагается нажать CS/0 для запуска SETUP. Запуск которого позволит вам изменить визуальные и конфи- гуративные параметры работы ассебблера и, при желании, записать их на диск. Все изменения, внесенные в SETUP, записываются непо- средственно в тело моноблока ассемблера "alasm.С". Функция за- пуска SETUP доступна только при холодном запуске. После соответствующего сообщения нажатие любой клавиши приве- дет к очистке экрана и выходу в рабочую строку ассемблера. ──────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────── 3. КОМАНДЫ СРЕДЫ АССЕМБЛЕРА Среда ассемблера обладает собственной системой команд, боль- шинство которых совместимы с командами TASM2.0. Список этих команд может быть получен на экране нажатием клажиши "Н" (HELP). Ввести необходимую команду можно, нажав ла- тинскую букву, входящую в состав этой команды в виде заглавной. При этом введенная команда отображается в рабочей строке, после чего, если это необходимо, ждет ввода операндов или, в зависи- мости от назначения, подтверждения нажатием ENTER. После ввода команды она дублируется в рабочем экране и выпол- няется. В случае некорректности операндов выводится соответству- ющее сообщение. Выполнение любой команды может быть прервано нажатием BREAK. Если в результате выполнения команды может быть потерян текст, то, если он был изменен, выводится запрос на его сохране- ние: File has been changed. Save(Y/N)? В систему команд среды ассемблера входят: Help Формат: HELP Вывод на экран списка команд, доступных в ассемблере и редакторе Команда HELP не содержит операндов и не нуждается в подтвержде- нии нажатием ENTER. Quit Формат: QUIT [адрес][,страница] Выход из ассемблера. В случае, если параметры не заданы, проис- ходит выход через дно стека, в противном случае осуществляется безусловный переход по указанному адресу. Параметр "страница" передается в драйвер верхней памяти (по умолчанию задает- ся 0). В качестве параметров "адрес" и "страница" могут быть ис- пользованы метки или содержащие их арифметические выражения. Debug Формат: DEBUG Выход в отладчик STS. При отсутствии в странице 7 монитора выдается соответствующее сообщение. Если перед вводом этой ко- манды был откомпилирован текст, то в указатель адреса отладки монитора будет записан адрес последнего ORG. При этом, набрав в отладчике SS/5, Вы получите возможность отлаживать свою про- грамму, наблюдая на экране имена меток по их адресам. Run Формат: RUN [адрес][,страница] Выполняет те же действия, что и команда QUIT, но перед этим за- носит в стек адрес возврата в резидентный модуль ассемблера, что позволяет вернуться в ассемблер из запускаемой программы по команде RET. По умолчанию параметр "адрес" принимает значение последней директивы ORG, а параметр "страница" - 0. Work Формат: W0RK [drive:][filename[.ext]] Загрузка файла в текущую рабочую страницу. По умолчанию задается расширение "Н". "filename" может представлять собой маску. В этом случае будет загружен первый файл, который ей удовлетворяет. В случае, если параметр "filename" не введен, то пользователю предоставляется возможность выбрать файл из каталога текущего или указанного диска путем выбора его курсором из списка файлов, появляющегося в верхнй части экрана. Catalogue Формат: CATAL0GUE [drive:][mask] По умолчанию задается "*.*" (все файлы). Выводит на экран каталог диска. Формат маски определяется следующим образом: знак "?" определяет, что в данной позиции может находиться любой символ. Знак "*" определяет, что, начиная с данной позиции все символы могут принимать произвольные значения. При достижени ограничителя (символ "." или конец строки) предполагается, что остальная часть строки заполнена символами "ПРОБЕЛ". nUmbers Формат: NUMBERS [параметр] Смена системы счисления отображаемой числовой информации. "Пара- метр" представляет собой одно из двух выражений: "DEC" или "НЕХ" Name Формат: NAME newfilename[.ext] Сменить имя файла на новое. По умолчанию задается расширение "Н". "newfilename" - новое имя файла. Print Формат: PRINT [bytes list] Выводит в порт ZX-LPRINT текущий текст, предварительно выводя указанный список байт. Байты указываются через запятую. Edit Формат: EDIT [дисковод:][имя файла] Переход к редактированию файла в текущей странице. В случае, если задан параметр "имя файла", файл с таким именем загружа- ется в текущую страницу. Если же файл на диске не найден, в текущей странице создается новый файл с введенным именем. Merge Формат: MERGE [дисковод:]имя файла Подгрузка текстового файла формата ALASM в конец текущего файла. Параметр "имя файла" является обязательным. counT Формат: C0UNT арифметическое выражение Производит вычисление указанного арифметического выражения. Ре- зультат вычислений выводится в десятичной и шестнадцатиричной системах. В качестве параметров арифметического выражения могут использоваться метки, их старшие и младшие байты. sYmbol Формат: SYMB0L [маска] Вывод на экран списка меток, удовлетворяющих условию "маска". Команда выполняется только в случае, если до этого была произ- ведена компиляция. В качестве атрибута метки могут выводиться следующие сообщения: число - Значение метки, определенное при компиляции; NoDef - Метка не была определена, но была использована; Macro - Метка представляет собой имя блока макроопределения; Wrong - Формат метки не определен вследствие ошибок компиляции. Assemble Формат: ASSEMBLE Производит компиляцию текста в текущей странице, начиная с пер- вой строки. В процессе компиляции на экран выводится количество- откомпилированных строк для контроля зависания машины. По окончании компиляции на экран выводятся сообщения: Symbols: ААААА-ВВВВВ Указанная разность представляет собой количество свободной памят в странице, отведенной под таблицу меток. В случае, если таблица меток разведена по различным страницам, параметр ААААА указывает адрес последней записи в P0ST SYMB0LS PAGE, а параметр ВВВВВ - в SYMB0L LIST PAGE; Save Формат: SAVE [+][дисковод:] Запись на диск отредактированного текста. При указании параметра "+" на текущий или указанный дисковод записываются все файлы, у которых установлен маркер изменения. В противном случае на диск записывается текущий файл. В случае, если файл с таким именем на диске уже существует, он удаляется без дополнительных запросов. Info Формат: INFO Выдает на экран номер версии, список номеров системных страниц памяти и перечисление файлов, находящихся во всей памяти ком- пьютера на момент подачи команды. paGe Формат: PAGE [номер страницы] Переход к странице, указанной в качестве параметра "страница". До следующего изменения параметра команды PAGE указанная страни- ца становится текущей и все команды для текущих страниц будут выполняться над ней. driVe Формат: DRIVE дисковод: Указанный дисковод становится текущим и все команды для текущего дисковода будут оперировать с ним. Jumb Формат: JUMB [+] Эта команда заменяет в текущем файле все указатели однократной компиляции с "-" на "+". Если задан параметр, то будет просмо- трена вся память. ──────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────── 4. КОМАНДЫ РЕДАКТОРА При входе в окно редактирования экран разбивается на две час окно редактирования и информационная строка, в которой отображае номер страницы текущего файла, его имя, количество свободной па- мяти в этой странице и количество байт, перенесенных в карман (если это число не равно 0). В этой же строке обеспечивается под ча сервисных команд обслуживания текста. В процессе редактирования пользователю доступны сервисные ко манды обслуживания текста, однако в отличии от среды ассемблера, результат их выполнения не отображается на экране в виде тексто- вого сообщения, а контролируется самим пользователем. Список команд редактора асемблера ALASM: Quit Формат: Q Выход из редактора в среду асемблера. Begin Формат: В Переход к началу текста. End Формат: E Переход к концу текста. Search Формат: SEARCH [строка символов] Поиск строки символов по тексту. Поиск начинается с позиции, сле дующей за текущей позицией курсора и продолжается до конца тек- ста. При остановке поиска он может быть продолжен путем ввода комбинации SS/I, причем если такая командя дана за концом послед ней строки текста, поиск будет начат с его начала. Если параметр "строка символов" не указан, то будет использована строка, введенная в предыдущий раз. sYmbol Формат: SYMB0L [имя метки] Поиск описания метки по тексту. При поиске предполагается, что первый символ имени метки находится в нулевой позиции. Свойства - аналогично SEARCH. coDe Формат: C0DE ХХХ>[код символа] Установка в позицию курсора символа с произвольным кодом, наби- раемым на клавиатуре. При вводе команды появляется код символа, находящегося в текущей позиции курсора и предлагается заменить его на другой. Если параметр игнорировать, никаких действий произведено не будет. Restore Формат: R Копирование содержимого кармана в позицию курсора. Строка, на которой находится курсор, оказывается первой после содержимого кармана. После этой операции сбрасывается флаг разрешения до- полнения кармана. Clear Формат: С Очистка кармана. Xreplace Формат: REPLACE строка1>строка2 Начиная с позиции, следующей за текущей позицией курсора, про- изводится поиск текста "строка1". Как только он будет обнаружен, выдается сообщение "REPLACE(Y/N/G)?". При ответе "Y" текущая "строка1" заменяется на "строка2" и поиск продолжается дальше. При ответе "N" поиск продолжается без замены. При ответе "G" все встреченные выражения "строка1" будут заменены на "строка2" без дополнительных запросов. В любой момент работы команды ее выполнение может быть прервано нажатием BREAK (CS/SPACE). Line Формат: LINE номер строки Устанавливает курсор на строку с указанным номером. Строки нумеруются с нулевой и до конца текста с приращением 1 на каждой строке. Jumb Формат: JUMB [+] Без параметра производит сканирование текста в текущей странице с целью замены директив "-" на "+" (эта операция автоматически производится при загрузке каждого файла с диска). С параметром [+] производится сканирование всех текстов, найденных в памяти. При редактировании текста пользователю доступны функции, вызываемые одновременным нажатием двух клавиш. Эти функции ускоряют работу в редакторе и не имеют операндов: SS/I - продолжение поиска; SS/D - переключение русского и латинского регистров ввода тек- стовой информации. Изменение регистра индицируется видоизменением курсора; SS/Q - удаление текущей строки. При выполнении этой команды удаляемая строма автоматически переносится в карман, но только в том случае, если он не был занят другой инфор- мацией; SS/W - вставка пустой строки. Текущая строка сдвигается вноз; SS/E - копирование текущей строки в карман. После этой команды курсор перемещается на следующую строку; CS/1 - табуляция; CS/2 - вставка пробела в позицию курсора. Остальная часть строки сдвигается вправо; SS/SP- на экран выводится список файлов, в котором с помощью курсора выбырается нужный для редактирования; ──────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────── 5. ДИРЕКТИВЫ АССЕМБЛЕРА При написании компилятора Автор придерживался набора дирек- тив, принятых в TASM3.0. Директивы, не присутствующие в вышеука- занном творении, выбраны в соответствии с международной практи- кой написания компиляторов языка ассанблера, т.е. с помощью фонаря и англо-русского словаря. Список директив компилятора ALASM и их описание: 1. ORG адрес[,страница] Установка адреса компиляции. По умолчанию параметр "страница" задается равным 0. В качестве информации о текущем адресе ком- пиляции может использоваться символ "$", эквивалентный обраще- нию к зарезервивованной переменной, содержащей адрес первого байта команды, в которой произошло обращение. Пример: ORG #7D19 LDIR ;LDIR записан по адресу #7D19 ORG #СОб9,#84 INDR ;INDR записан по адресу #СОб9 в странице #84 верхней памяти ──────────────────────────────────────────────────────────────── 2. метка EQU значение Присваивает метке значение, эквивалентное параметру "значение". Пример: SCREEN EQU #4000 ;SCREEN=#4000 ATTRS EQU #5В00 ;ATTRS=#5В00 SCR_LEN EQU ATTRS-SCREEN ;SCR_LEN=#1В00 ──────────────────────────────────────────────────────────────── 3. Опреации выделения старшего и младшего байтов слова: NUMB1 EQU #1234 NUMB2 EQU #ABCD STBMLB EQU .NUMB1*25б+'NUMB2 ;STBMLB=#ЗЧАВ MLBSTB EQU 'NUMB1*25б+.NUMB2 ;MLBSTB=#12CD ;Старайтесь избегать деления на 25б для получения старшего байта ;необходимого слова, так как деление занимает в 280 раз больше ;времени, чем просто операция выделения старшего байта DEFB 'NUMB2 ;Абсолютно эквивалентно, но намного быстрее, чем DEFB NUMB2/25б ;При задании байтового значения метки младший байт выделяется ;автоматически DEFB .NUMB1 ;эквивалентно DEFB NUMB1 ;поэтому используется в основном для DEFW .NUMB1 ──────────────────────────────────────────────────────────────── 4. DISP адрес Установка адреса, в котором должна работать программа. ENT Присвоение адресу работы программы текущего адреса компиляции. Пример: SCREEN EQU #4000 ORG #8000 LD HL,BEGIN ;Пересылка в область экрана LD DE,SCREEN ;и запуск программы ожидания LD ВС,END-BEGIN ;[А] прерываний LDIR CALL SCREEN DI HALT BEGIN DISP SCREEN MARKA DEC А HALT JP NZ,MARKA ;JP - не случайно RET ENT END ──────────────────────────────────────────────────────────────── 5. INCLUDE "дисковод:имя файла"[,страница] Включение в компилируемый файл дополнительного текстового блока, записанного на диске под именем "имя файла". При этом указанный файл загружается в страницу, определенную параметром "страница" (по умолчанию - текущая). По окончании компиляции включенного блока компиляция продолжается со строки, следующей после данной директивы. Особенностью данной директивы является то, что файл, указанный в ней, не будет загружаться с диска, если он уже нахо- дится в необходимой странице. Пример: LDIR INCLUDE "T0KENIZE",1 0TDR INCLUDE "ALASM2" HALT ;Сначала быдет откомпилирован LDIR, потом текст "T0KENIZE.Н", ;загруженный в страницу 1, потом 0TDR, затем в текущую страницу ;будет загружен и откомпилирован текст "ALASM2.Н", после чего ;с диска будет считан основной файл и компиляция продолжится ;с команды HALT. ──────────────────────────────────────────────────────────────── б. MAIN "имя файла"[,страница] Указание основного файла компиляции. Директива MAIN должна быть первой исполнимой директивой подчиненного файла. Будьте внимательны с именами файлов, содержащими символы "." или "*". Лучше заменить их на символ "?". Пример: MAIN "МАКEб?7",б LDIR ;После подачи команды ASSEMBLE компиляция передается ;программе МАКEб*7, находящейся в странице б, ;затем находящийся в ней INCLUDE вызывает подчиненную ;программу, состоящую из директивы MAIN и команды LDIR. ;Во включаемых файлах MAIN игнорируется, поэтому после ассембли- ;рования LDIR происходит возврат в основную програму и продолже- ;ние компиляции. ──────────────────────────────────────────────────────────────── 7. INCBIN "дисковод:имя файла"[,длина] Включение в компилируемую программу кодового блока, записанного на диске под именем "имя файла" размером "длина" байт или по умолчанию из данных каталога. Пример: ORG #E000 LD HL,SCRFILE LD DE,#4000 LD ВС,б144 LDIR RET SCRFILE INCBIN "SСRб?7",б144 ;По адресу SCRFILE в процессе компиляции будет загружен файл ;SСRб*7, который после запуска будет перенесен в экран. ──────────────────────────────────────────────────────────────── 8. DUP число Левая программная скобка. Указывает на начало блока, который нео ходимо компилировать "число" раз подряд EDUP Правая программная скобка. Указывает на конец повторяемого блока Пример: DUP 32 LDI LD А,В 0R С JR Z,$+3 ;$ - адрес первого байта компилируемой команды LD (HL),D EDUP ;Блок текста между DUP и EDUP будет откомпилирован 32 раза ──────────────────────────────────────────────────────────────── 9. DEFM "строка символов"[,"строка символов"] Резервирование строки символов. Пример: DEFM "Здесь была строка символов"," ВАСЯ" ──────────────────────────────────────────────────────────────── 10. DEFB байт[,список байт] Резервирование списка байт Пример: DEFB "У",13,10,"попа",13,10,"была",13,10,"собака",13,10 ──────────────────────────────────────────────────────────────── 11. DEFW слово[,список слов] Резервирование списка слов. Пример: DEFW ALASKA,BUFFER,12,#BD15,327б7,.NUMB1 ──────────────────────────────────────────────────────────────── 12. DEFS количество повторений[,список байт] Список байт (по умолчанию - 0) копируется в текущий адрес компи- ляции. Число циклов равно параметру "количество повторений". Пример: LD SP,#5В00 DEFS 8,#С5,#D5,#E5,#F5 ;эквивалентно ; DUP 8 ; PUSH ВС ; PUSH DE ; PUSH HL ; PUSH AF ; EDUP ──────────────────────────────────────────────────────────────── 13. +<директива ассемблера> При загрузке текста с диска он сканируется на наличие в нем указателей "+" в начале каждой строки. В процессе компиляции все встреченные указатели "+" будут заменены на "-", что ука- жет компилятору на отсутствие необходимости компиляции строки при следующем ассемблировании. Пример: LD HL,#DB00 +SAVEADR + ORG #DB00,7 + INCBIN "stsЧ.2а" +ORG SAVEADR JP (HL) ;основной файл отладчика будет загружен только при первой ком- ;пиляции текста, содержащего эти команды. ──────────────────────────────────────────────────────────────── 14. метка=выражение Переприсвоение значения уже существующей метки. Пример: SHLUSS EQU 0 ORG 327б8 DUP #4000 DEFW SHLUSS SHLUSS=SHLUSS+1 EDUP ;вся память выше #8000 будет заполнена увеличивающимися словами ;от 0 до 1б384 ──────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────── б. При компиляции исходного текста возможна выдача ошибок времени компиляции, связанных с невнимательностью программиста. Список ошибок времени компиляции ассемблера ALASM 0 - синтаксическая ошибка; 1 - зарезерворована; 2 - зарезервирована; 3 - короткий переход некорректен; 4 - зарезервирована; 5 - зарезервирована; б - повторное описание метки; 1 - зарезерворована; 2 - зарезервирована; 3 - короткий переход некорректен; 4 - зарезервирована; 5 - зарезервирована; б - повторное описание метки; 7 - зарезервирована; 8 - зарезервирована; 9 - зарезервирована; 10 - компиляция в ПЗУ; 11 - недопустимая операция; 12 - неправильная MACR0-операция; 13 - не используется; 14 - ошибка системного стека; 15 - ошибка диска; Ошибки времени заполнения: wrong short - неправильное обращение к метке за пределами "короткого" поля; пот defined - метка не определена. ────────────────────────────────────────────────────────────────