С о д е р ж а н и е ------------------- CTP. Раздел 1. Запуск. 1.1 Введение и инструкции загрузки..............1 1.2 Получение копии системы.....................4 Раздел 2. Подробности GENS4. 2.1 Принцип работы GENS4, ключи ассемблирования, формат листинга и т.п.......................5 2.2 Формат оператора ассемблера................12 2.3 Метки......................................14 2.4 Таблица символов...........................16 2.5 Выражения..................................18 2.6 Макроопределения...........................21 2.7 Директивы ассемблирования..................25 2.8 Команды условной трансляции................28 2.9 Команды ассемблера.........................29 Раздел 3. Строчный редактор. 3.1 Введение в редактор........................33 3.2 Команды редактора..........................36 3.3 Пример использования редактора.............53 Приложение 1. Коды ошибок и их значение.................55 Приложение 2. Резервирование слов, мнемоника и т.д......57 Приложение 3. Рабочий пример............................59 Р а з д е л 1. З а п у с к. ============================= 1.1. Введение и инструкции загрузки =================================== GENS4 - это мощный и легкий в использовании ассемблер для Z80, кото- рый очень близок к стандартному ассемблеру ZILOG по определению. В отли- чии от многих других ассемблеров, пригодных для компьютеров "SPECTRUM", GENS4 является обширной, профессиональной частью программного обеспечения и побуждает вас очень тщательно изучать следующие разделы вместе с приме- ром Приложения 3 перед попытками использования ассемблера. Если вы еще новичок, то вначале проработайте Примечание 3 или про- консультируйтесь в одной из отличных книг, приведенных в библиографии. У нас есть версии систем DEVPAC 4 на диске, для DISCIPLE & DISCOVERY дисковой системы и для компьютеров SPECTRUM PLUS 3. Эти версии работают точно так же, как описано в этом документе, просто заменяйте слово "мик- ропривод", там где оно встречается, на слова "диск OPUS", "диск PLUS 3" или "DISCIPLE диск" в соответствии с вашей системой. Существует несколько внешних особенностей для версии PLUS 3, которые описаны на дополнительном листке. GENS4 занимает приблизительно 10К в памяти и использует свой внешний стек, так что это - замкнутая часть программного обеспечения. Она содер- жит собственный строчный редактор, который помещает текстовой файл сразу за кодами GENS4, в то время как таблица символов ассемблера создается за текстовым файлом, поэтому вы должны предоставить достаточное прост- ранство, чтобы поместить сам ассемблер, таблицу символов максимального размера и текстовый файл, который вы, вероятно, будете использовать в те- кущем сеансе. Поэтому загружать GENS4 часто удобнее в нижние адреса памя- ти. Существует 2 версии ассемблера на кассете, обе на стороне 1. Сначала помещена версия с 51 символом в строке, за ней следует рассматриваемая версия с 32 символами. Их имена на ленте являются соответственно GENS4-51 и GENS4 и вы должны использовать ту версию, которая больше вам подходит. Версия GENS4-51 на 400 байт длиннее, чем GENS4. Для загрузки GENS4 поместите магнитную ленту с ним в кассетный маг- нитофон и введите: LOAD ""CODE XXXXX [ENTER] и нажмите клавишу "воспроизведение" магнитофона. Или: LOAD "GENS4" CODE XXXXX [ENTER] или: LOAD "GENS4-51" CODE XXXXX [ENTER], где: XXXXX - десятичный адрес, с которого вы хотите загрузить GENS4. Только после того, как вы загрузите коды GENS4 в компьютер, вы може- те войти в ассемблер, набрав: RANDOMIZE USR XXXXX, где XXXXX - адрес, с которого загружены коды ассемблера. Если в любой последующий момент вы вновь пожелаете войти в ассемб- лер, то вы должны просто адресоваться к ячейке XXXXX, которая хранит предварительно созданный файл информации. Например, вы хотите загрузить ассемблер с десятичного адреса 26000. Для этого наберите: LOAD "" CODE 2600 [ENTER] RANDOMIZE USR 2600 [ENTER] Для перезапуска ассемблера используйте: RANDOMIZE USR 2600 в пределах BASICа. Только после ввода GENS4 на экране возникнет подсказка в виде симво- ла ">"(подсказка команд редактора). Раздел 3 содержит информацию о том,как нужно вводить и редактировать текст, а раздел 2 - о том, что нужно вводить. 1.2. Получение копии системы ============================ После загрузки GENS4 в память вашего SPECTRUM'а вы можете получить копию ассемблера следующим образом: SAVE "GENS4-51" CODE XXXXX,11392 [ENTER] или SAVE "GENS4"2 CODE XXXXX,11010 [ENTER] для кассеты SAVE * "М";1;"GENS4-51" CODE XXXXX,11392 [ENTER] или SAVE * "М";1;"GENS4" CODE XXXXX,11392 [ENTER] для микродрайвера, где: XXXXX - адрес, с которого вы загрузили GENS4. Вы должны сделать эту копию перед входом в GENS4 для того, чтобы сохранить перемещаемую информацию внутри программы. Инструкции получения копий для DEVPAC серии PLUS смотрите на допол- нительном листке. Пожалуйста, заметьте, что мы разрешаем вам сделать копию GENS4 для вашего собственного пользования, чтобы вы могли уверенно программировать. Пожалуйста, не делайте копий GENS4 для передачи (или, что еще хуже, для продажи) вашим друзьям. Мы выпускаем программное обеспечение по очень ра- зумной цене и полной послепродажной поддержкой, но если люди сами начнут копировать наше программное обеспечение, то мы перестанем продолжать это делать. Пожалуйста, покупайте, но не крадите! Р а з д е л 2. П о д р о б н о с т и G E N S 4. ================================================== 2.0. Принцип работы GENS4, ключи ассемблера, формат листинга. ============================================ GENS4 является быстрым двухпроходным ассемблером для Z80, который ассемблирует всю стандартную мнемонику для Z80 и содержит следующие осо- бенности: макросы, условное ассемблирование, множество команд ассемблера и таблицу символов в виде двоичных троек. Когда вы вызываете ассемблирование, то вы используете команду "А": А4,2000,1:TEST [ENTER] Первый код (4 - см. выше) после А определяет условия трансляции, ко- торые вы хотите иметь в данный момент. Эти условия трансляции и их ключи будут перечислены ниже. Если вы не хотите использовать ключи, то номер набирать не надо, поставьте только запятую. Второй код (2000 - см. выше) - это десятичный размер символов в бай- тах. По умолчанию (при простом использовании запятой без кодов), GENS4 будет выбирать размер таблицы символов, подходящий к размеру исходного файла - обычно это бывает вполне приемлемо. Однако, при использовании ключа "включить" вы можете задать размер таблицы символов больше обычно- го, ассемблер в этом случае не будет определять размер таблицы символов, которая будет построена. После указания размера таблицы символов вы можете ввести имя файла, например, 1:TEST, как указано выше. Если вы это сделаете, то результирую- щий объектный код, полученный в результате ассемблирования, будет сохра- нен автоматически, независимо от размера генерируемого кода. Если вы не хотите использовать такую возможность, то имя файла не вводите. Не вводи- те вторую запятую, иначе GENS4 будет считать, что вы вводите пустое имя файла! Более подробно с командой "А" можно познакомиться в приложении 3. Ключи ассемблирования: 1 - выдает листинг таблицы символов в конце второго прохода ассемблирова- ния; 2 - запрет на генерацию объектного кода; 4 - производит листинг ассемблирования (отметим, что в ранних версиях ассемблера такой возможности не было); 8 - направить листинг ассемблирования на печать; 16- просто помещает объектный код, если он, конечно, получен, после таб- лицы символов. Счетчик адресов обновляется. Таким образом, объектный код может быть помещен в одну область памя- ти, а работать - в какой-либо другой; 32- исключение проверки того, куда помещается объектный код (это бывает полезно для ускорения ассемблироания); Для того, чтобы скомбинировать ключи, просто складывайте их один с другим. Так, код "А33" производит быстрое ассемблирование - не выдается листинг, не производится проверка, чтобы увидеть, куда в настоящий момент помещают объектный код, при этом в конце выдается листинг таблицы симво- лов. Отметим, что при использовании ключа "А16" директива "ENT" не будет иметь эффекта. Если использован ключ "А16", то вы можете определить, где находится объектный код, используя команду редактора "Y". По этой команде можно определить конец текста (его называют второй номер) и затем доба- вить к нему назначенный размер таблицы +2. Ассемблирование происходит за два прохода: в течение 1-го прохода GENS4 ищет ошибки и собирает таблицу символов, второй проход генерирует объектный код (если не указан ключ 2). В течение первого прохода на экра- не и принтере ничего не отображается, пока не встретится ошибка. В случае ошибки будет выдано сообщение об ошибке с номером ошибки за ним (см. Приложение 1). Ассемблирование приостанавливается - нажмите клавишу "Е" для возврата в редактор или любую другую клавишу для продолжения ассемб- лирования следующей строки. В конце первого прохода будет выдано сообщение: PASS 1 ERRORS: NN Если хоть одна ошибка будет обнаружена, то ассемблирование затем бу- дет остановлено и перехода ко второму просмотру не произойдет. Если ка- кие-нибудь метки были обнаружены в поле операнда, но не объявлены в поле метки, то последует сообщение: *WARNING* LABEL ABSENT В течение второго прохода генерируется объектный код (если генерация не запрещена ключом 2 (см. выше)). Во время второго прохода листинг ассемблера не производится, кроме случая, когда указан ключ 4 или команда ассемблера L+. В 32-х символьной версии листинг ассемблера состоит обычно из двух строк в следующей форме: с000 210100 25 LABEL LD HL,1 1 6 11 21...26 тогда как в 51-символьной версии листинг печатается в одну строку. Если листинг не помещается в одну строку, то он завершается на следующей. На первом месте в строке стоит значение счетчика адресов, который соответствует данной строке. Если в строке встречаются инструкции ORG, EQU или ENT (см. 2.7), то на первом месте будет стоять значение поля операнда инструкции. Эта запись обычно отображается в шестнадцатиричном виде, хотя используя команду "*D+" ее можно отобразить и в неудобном десятичном виде (см. 2.9). Следующая запись с позиции 6 занимает до 8 символов в строке (представляет до 4-х байтов) и является объектным кодом текущей инструк- ции (см. ниже команду *С). Затем следует номер строки - целое число в диапазоне 1... 32767. Позиции 21...26 первой строки содержат 6-символьную метку, опреде- ленную в этой строке. После метки следует мнемоника инструкции, которая занимает поз. 21...24. (в 32-символьной версии это будет новая строка, если только не использовать команду *С). Затем, с позиции 2, следует поле операндов, и завершают строку ком- ментарии, которые при необходимости можно продолжить на другой строке. Команда *С ассемблера может быть использована для получения короткой строки листинга ассемблирования - ее вводят, чтобы не включать 9 симво- лов, представляющих объектный код инструкции. Это дает возможность отоб- разить большинство строк ассемблера в виде, удобном для экрана со строкой в 32 позиции (см. ниже разд. 2.8.). Изменение формата листинга. (только для 32-символьной версии) ================================= С помощью команды "POKE" вы можете модифицировать форму, по которой каждая строка листинга разбивается внутри 32-символьной версии GENS4 на 3 части. Указания, как это сделать, приведены ниже. Мы отличаем понятие "строка ассемблера", которая является текущей строкой листинга ассемблера и хранится во внешнем буфере, от понятия "экранная строка", которая явля- ется строкой, действительно возникающей на дисплее. Строка ассемблера обычно порождает более одной экранной строки. 1. 51-й (#33) байт от начала GENS4 содержит значение, определяющее пози- цию, до которой будет отображаться строка листинга на экране. Цикли- чески меняя этот байт от 0 до любого другого значения (256) можно заканчивать первую экранную строку в необходимом месте (это особенно полезно при использовании микроформатного принтера). 2. 52-й (#34) байт от начала GENS4 дает номер позиции, с которой должна начинаться каждая последующая экранная строка. 3. 53-й (#35) байт от начала GENS4 указывает количество символов остатка строки ассемблера, который будет выведен во второй экранной строке после первой. Например, вы хотите, чтобы каждая первая экранная строка содержала 20 символов (т.е. не включала бы поле метки) и затем каждая последующая экранная строка начиналась с позиции 1 и занимала бы всю строку. Также предположим, что вы загрузили GENS4 с десятичного адреса 26000. Чтобы по- лучить вышеуказанные изменения, надо из BASICа ввести следующие инструк- ции: POKE 26051,20 POKE 26052,1 POKE 26053,31 Вышеприведенные модификации возможны только в том случае, когда не была использована команда *С. Листинг может быть приостановлен в конце строки нажатием [CAPS SHIFT] и [SPACE] вместе. В последующем нажимайте клавишу "Е" для возврата в редактор или любую другую клавишу для продолжения листинга. Единственными ошибками, которые могут появиться во втором проходе, являются ошибки типа "*ERROR*10 (см. Прил.1) и "BAD ORG!" (которая появ- ляется, когда объектный файл накладывается на GENS4, исходный файл или на таблицу символов - это может быть предотвращено использованием другого формата). *ERROR* 10 - это не фатальная ошибка, поэтому вы можете продол- жать ассемблирование, как и на первом проходе, тогда как ошибка "BAD ORG!" является фатальной и сразу же возвращает управление редактору. В конце второго прохода на дисплее будет отображено сообщение, сле- дуя за предыдущим об отсутствующих метках: PASS 2 ERRORS:NN Затем появится следующее сообщение: TABLE USED: XXXXX FROM YYYYY Это сообщение информирует о том, какая часть таблицы символов была заполнена. В этом случае, если была правильно использована директива "ENT", выдается сообщение: EXECUTES: NNNNN IS DISPLAYED Это показывает стартовый адрес задачи. Вы можете выполнить задачу, используя команду редактора "R". Будьте осторожны при использовании ко- манды "R" в том случае, когда вы не завершили успешно ассеблирование и не увидели сообщения "EXESUTES:NNNNN". Итак, если указан ключ "1", то используется список меток в алфавит- ном порядке и будут напечатаны соответствующие им значения. Количество информации, отражаемой в одной строке, может быть изменено директивой "POKE" с адреса "начало GENS4 + 50" помещением в эту ячейку уместного значения, по умолчанию заносится 2. 2.2. Формат оператора ассемблера. ================================= Каждая строка текста, которая будет обрабатываться GENS4, должна иметь следующий формат, где определение поля необязательно: метка код команды операнды комментарий START LD HL,LABEL ; получение метки Пробелы и табуляция обычно игнорируется. Строка обрабатывается сле- дующим образом: Первый символ строки проверяют и последующие действия зависят от его сущности: ; - целую строку трактуют как комментарий, т.е. просто игнорируют; * - предполагается, что следующий символ (символы) образуют команду ассемблера (см. Пункт 2.8). Все символы после команды тракту- ются как комментарии; - символ конца строки. Линия просто игнорируется; _ - пробел или табуляция. Если первым символом строки является про- бел или табуляция, то GENS4 предполагает, что следующий отличный от пробела или табуляции символ будет началом кода команды Z80. Если первый символ строки отличается от вышеприведенных, то в строке должна быть метка - см.п.2.2. После обработки присутствующей метки (или если первый символ в стро- ке - пробел или табуляция) ассемблер исследует следующий значащий символ и предполагает, что он будет или символом конца строки, или началом ко- манды Z80 (см. Прил.2), состоящий из 4-х символов и ограниченный пробе- лом (табуляцией или ). Иногда присутствует код команды и требуется один или более операн- дов, тогда поле операндов следует после набора пробелов (табуляции). Оператор может состоять только из одной, это бывает полезно для улучшения читаемости листинга. Комментарии могут следовать в любом месте после поля операндов или поля кода команды (если у нее нет аргументов). 2.3. Метки ========== Метка - это символьное имя, представляющее 16 бит информации. Метка может быть использована для выделения адреса особенной инструкции, или для выделения области данных, или может быть использована как константа для директивы "EQU"(см. п. 2. 7). Если метку представить значением более 8 битов и она затем использу- ется в контексте применительно к 8-битовой константе, то ассемблер будет выдавать сообщение об ошибке: LABEL EQ #1234 LD A,LABEL будет выдано *ERROR*10, когда во время второго прохода обработка второго операнда. Метка может содержать любое количество символов (см. ниже), хотя только первые 6 символов - значащие. Эти первые 6 символов должны быть уникальными, иначе метка будет повторно определена (*ERROR*). Метка не должна образовывать зарезервированное слово, хотя зарезервиро- ванное слово можно внедрить как часть метки. В метках можно использовать символы 0...9,A...Z и $. Можно использо- вать как большие, так и малые буквы, символы [,\,],^ ,#,и _. Метка должна начинаться с буквы. Некоторые примеры возможных меток представлены ниже: LOOP а_LONG_LABEL L[1] L[2] а_ LDIR -это незарезервированная инструкция TWO^S 2.4. Таблица символов ===================== Когда метка встречается в первый раз, ее помещают в таблицу вместе с двумя признаками, которые позже показывают, как эту метку соотносят по алфавиту с другими, находящимися внутри таблицы. Если в первый раз метка появляется в поле меток, то ее значение (данное счетчиком адресов или значение выражения "EQU") заносят в таблицу символов. В другом случае значения заносятся,когда бы ни встретилось имя метки в последующем в поле метки. Данный тип таблицы символов называется таблицей символов типа двоич- ного дерева и ее структура дает возможность заносить имена и извлекать их за очень короткое время - это существенно для больших программ. Запись в таблице занимает от 8 до 13 бит, в зависимости от длины имени. Если за время первого прохода имя встречается более одного раза, то будет выдано сообщение об ошибке (*ERROR *4), так как ассемблер не знает, какое значение должно соответствовать имени метки. Если значение для имени не найдено, то в конце ассемблирования будет выдано сообщение: *WARNING* SYMBOL ABSENT Отсутствие определения имени не мешает продолжению ассемблирования. Отметим, что только первые 6 символов метки вводятся в таблицу сим- волов, что определяется ее размером. В конце ассемблирования вам могут быть выданы сообщения статистики, о том, как много памяти было использо- вано таблицей символов в течение трансляции - вы можете изменить макси- мальный размер памяти, отведенный под таблицу символов. 2.5.Выражения ============= Выражения - это запись операндов, образованная или простым термом или комбинацией термов, разделенных операндом. Ниже определены понятия терма и операнда: Терм: десятичная константа например: 1024 шестнадцатиричная константа например: #4А5 двоичная константа например: %100101 символьная константа например: "А" метка например: L1029 Может также использоваться для обозначения текущего значения счетчи- ка адресов. Оператор: + - сложение - - вычитание & - логическое "и" (AND) @ - логическое "или" (OR) ! - логическое "XOR" * - алгебраическое умножение / - алгебраическое деление ? - MOD-функция (а?В=а-(а/в)*в Замечание: # - используют для того, чтобы отметить начало 16-ричного числа % - используют для того, чтобы отметить начало двоичного числа " - символьная константа При считывании числа (десятичного, шестнадцатиричного или двоичного) GENS4 выбирает последние значения 16 бит числа (т.е. MOD 65536), напри- мер, 70016 станет 4480 и #5А2С4 становится #А2С4. Обеспечивается широкий набор операндов, но их приоритет не соблюда- ется: выражения вычисляются строго слева направо. Операторы *,/ и ? При- ведены для версий с дополнительными возможностями и не являются частью данного набора выражений, который мог бы увеличить размер GENS4. Если вы- ражение заключено в круглые скобки, то его представляют как содержимое адреса памяти. Так, в инструкции LD HL, (LOC+5) в регистровую пару HL загружается 16-ти битовое значение, содержащееся в ячейке памяти с ад- ресом LOC+5. Некоторые инструкции Z80 (JR и DJNZ) предполагают операнды, которые предполагают 8-ми битовые значения, а не 16-ти битовые - это называется относительной адресацией. Когда имеет место относительная адресация, GENS4 автоматически выдает значение счетчика адресов следующей инструкции из значения, представленного в поле операндов текущей инструкции для то- го, чтобы получить относительный адрес для текущей инструкции. Область допустимых значений относительного адреса простирается от -128+значение счетчика адресов следующей инструкции до значения счетчика адресов следу- ющей инструкции +127. Если же вы желаете определить относительный переход от значения счетчика адресов текущей инструкции, то вы должны использовать символ $ (резервную инструкцию), за которым следует требуемое смещение. Относи- тельно значения счетчика адресов текущей инструкции смещение должно нахо- диться в диапазоне от -126 до +129 включительно. Примеры выражений: 5000 - LABEL %1001101!%1011 - дает 1000110 #3456?#1000 - дает 456 4+5*3-8 - дает 19 $-LABEL+8 2345/7-1 - дает 334 "Y"-";"+7 (5*LABEL-#1000&%1111) 17&%1000 - дает 25 Отметим, что пробелы могут быть помещены между термами и операторами и наоборот, но не внутри термов. Если операция умножения получит ответ с абсолютным значением, боль- шим чем 32767, то появится ошибка *ERROR*15, тогда как при делении на 0 - ошибка *ERROR*14, в противном случае переполнение игнорируется. Вся арифметика использует вторую дополнительную форму, где любое число, большее чем 32767, представляется как отрицательное, например: 60000=-5536 (60000-65536) 2.6.Макроопределения ==================== Макроопределения позволяют вам писать более плотные, более значимые ассемблерные программы, но они должны использоваться осторожно и не долж- ны конфликтовать с подпрограммами. Макроопределение состоит из набора инструкций ассемблера вместе с именем макроопределения. Когда это имя в последующем используются в поле кода операции, то оно будет заменено на все инструкции ассемблера, составляющее это макроопределение. Так, макроопределение БNSUB может быть определено следующим образом: NSUB MAC OR а SBC HL,DE ADD HL,DE ENDM Когда бы мы в дальнейшем ни применили NSUB как код операции, оно бу- дет генерировать три инструкции ассемблера: OR А; SBC HL,DE и ADD HL,DE. Это спасет вас от лишнего печатания и сделает вашу программу легче для понимания, но вы должны помнить, что при каждом появлении NSUB гене- рируется объектный код, и, может быть, эффективнее использовать CALL для вызова вместо нее подпрограммы. Ниже мы приводим формат макроопределения и его вызов вместе с некоторыми примерами. Изучайте их, пожалуйста, вни- мательно. Макроопределение имеет следующую форму: имя MAC ... ... Тело макроопределения ... ... ENDM По имени макроопределения будет вызываться его текст когда это имя в последующем встретится в поле кода операции. "MAC" показывает начало мак- роопределения, а "ENDM" указывает на его конец. Параметры макроопределения могут упоминаться внутри макроопределения путем использования знака равенства, за которым следует номер параметра (0...31) включительно. Таким образом, макроопределение: MOVE MAC LD HL,=0 LD DE,=1 LD BC,=2 LDIR ENDM имеет три параметра, адрес источника, адрес приемника и длину, загружает нужные значения в HL, DE, и BC и затем выполняет инструкцию LDIR. Для то- го чтобы вызвать макроопределение из тела вашей программы, просто исполь- зуйте его имя в поле команд. За именем макроопределения должны следовать необходимые вам три параметра: MOVE 16384,16385,4096 В этом примере мы используем особенные адреса, но в действительности вы можете работать с любыми существующими выражениями для определения значения параметра макроопределения: MOVE START,START+1,LENGTH Подумайте, являются ли вышеприведенные примеры хорошим использовани- ем макроопределения? Не могли ли вы использовать подпрограмму? Внутри макроопределения параметры могут появляться в любом возможном выражении, например: HMC MAC LD HL,=0*3600 LD DE,=1*60 ADD HL,DE LD DE,=2 ADD HL,DE ENDM Это макроопределение имеет три параметра: часы, минуты, секунды. Макроопределение вычисляет общее количество секунд, определяемое парамет- рами, и помещает его в регистр HL. Вы можете использовать его следующим образом: HOURS EQU 2 MINUTES EQU 30 SECONDS EQU 12 START EQU 0 HMC HOURS,MINUTES,SECONDS LD DE,START ADD HL,DE ;HL - окончательное время Макроопределения не могут быть вложенными, так что вы не сможете ни определить макроопределение, ни вызвать макроопределение из макроопреде- ления. Во время ассемблирования, как только имя макроопределения встреча- ется в поле команды, ассемблируется его текст. Обычно этот текст тела макроопределения не попадает в ассемблерный листинг и печатается только для макроопределения. Однако вы можете усилить листинг расширением макро- определения, используя команду ассемблера *М+, А, используя *М-, запре- тить распечатывать текст макроопределения. Если вы вышли за пределы пространства, отведенного под буфер макро, то будет выдано сообщение и прервется ассемблирование. Используйте коман- ду редактора "С" для резервирования буфера больших размеров. 2.7. Директивы ассемблера ========================= GENS4 распознает определенные псевдокоманды - так называемые дирек- тивы ассемблера. Они не влияют на процессор Z80 при прогоне, т.е. Не де- кодируются, а просто заставляют ассемблер выполнять определенные действия во время трансляции. Эти действия определенным образом изменяют код, ге- нерируемый GENS4. Псевдокоманды ассемблера точно такие же, как и выполняемые инструк- ции: они могут помещаться за меткой (необходимо для EQU) и за ними может следовать комментарий. Возможны директивы: ORG <выражение> - устанавливает счетчик адресов равным значению выра- жения. Если ключи 2 и 16 оба не указаны и результат ORG попадает в область GENS4, текстового файла или таблицы символов, то появляется выражение "BAD ORG!" и прекращается трансляция (см. п.2.0). Для более де- тального ознакомления с TEM, как ключи 2 и 16 влияют на использование ORG см. команду "А" в разделе 3 для некоторых предосторожностей в использовании ORG, когда автоматически сохраняется объектный код. EQE <выражение> - этой директиве должна предшествовать метка. Значению метки присваивается значение выражения. Выражение не должно содержать имен, которым еще не присвоено зна- чение. В противном случае ассемблер выдает вам сооб- щение об ошибке - *ERROR*13. DEFB <выражение>, <выражение>...- каждое выражение должно оценивать 8 бит; байт, адрес которого в настоящий момент содержится в счетчике адресов, принимает значение выражения и счетчик ад- ресов увеличивается на... Все вышеуказанное повторя- ется для каждого выражения. DEFW <выражение>, <выражение>...- дополняет слово (2 байта), адрес которого указан счетчиком адресов, значением выражения и увеличивает счетчик адресов на 2. Младший байт помещается снача- ла, за ним следует старший байт. Повторяется для каждого выражения. DEFS <выражение> - увеличивает счетчик адресов на значение выражения. Эквивалент резервирования области памяти размером, равным значению выражения. DEFM "S" - определяет, что последовательность N байтов памяти будет будет равна представлению строки "S" в коде ASCII, где N - длина строки. Теоретически, длина строки может быть от 1 до 255 включительно, но прак- тически она ограничена длиной строки, которую можно ввести редактором. Первый символ в поле операндов (",как показано выше) является ограничителем и стро- ка "S" определяется только символами, лежащими между двумя ограничителями; символ конца строки также действует как ограничитель строки. ENT <выражение> - используется для определения адреса,на который осу- ществляется переход по команде редактора "R". 2.8. Команды условной трансляции =============================== Команды условной трансляции обеспечивают программисту возможность включения или не включения определенных секций исходного текста в процесс ассемблирования. Это возможно при использовании команд IF, ELSE, END. IF <выражение> - эта команда оценивает выражение. Если результат ра- вен нулю, то прекращается ассемблирование следующих линий до тех пор, пока не встретится ELSE или END. Если значение выражений отлично от нуля, то ассемб- лирование происходит нормально. ELSE - эта команда просто переключает ассемблирование. Если перед появлением ELSE было ассемблирование, то в последующем оно выключается и наоборот. END - просто включает ассемблирование. Отметим, что команды условной трансляции не могут быть вложенными, на вложенность "IF" не сделано никаких проверок и любая попытка вложения может привести к непредсказуемым результатам. Р а з д е л 3 . С т р о ч н ы й р е д а к т о р =================================================== 3.1. Введение в редактор ======================= Редактор, поставляемый со всеми версиями GENS4, является простым строчным редактором, разработанным для обслуживания всех операционных систем, сделанных для Z80. Редактор прост в использовании и дает возмож- ность редактировать программы просто и эффективно. Для уменьшения размера текстового файла редактор выполняет опреде- ленное сжатие пробелов. Это происходит по следующей схеме: когда вводится строка с клавиатуры, она символ за символом заносится во внешний относи- тельно ассемблера буфер и затем, в конце строки (когда вы нажимаете кла- вишу ), строка перемещается из буфера в текстовый файл. Во время этого перемещения происходит определенное сжатие пробелов: если первый символ строки - пробел, то в текстовый файл вводится символ табуляции, и все последующие пробелы пропускаются. Если первый символ в строке не про- бел, то символы заносятся из буфера в текстовый файл, пока не встретится пробел, после чего обработка ведется также, как если бы следующий символ был бы первым символом в строке. Это продолжается и в дальнейшем. В ре- зультате символы табуляции включаются в начале строки или между меткой и кодом операции, а так же между кодом операции, операндами и комментария- ми. Конечно, если код возврата каретки (ENTER) встречается в любое другое время, то преобразование завершается и управление передается редактору. Этот процесс сжатия понятен, и вы можете просто использовать клавишу "-->" для того, чтобы получить кратко протабулированный файл, который также экономичней для хранения. Заметим, что пробелы не сжимаются внутри комментариев и что пробелы не должны присутствовать в полях меток, кодов операций и операндах. Режим редактора включается автоматически при запуске GENS4 и за вспомогательным текстом следует подсказка редактора ">". В ответ на подсказку вы можете ввести командную строку следующего формата: С N1,N2,S1,S2 , где: "C" - мнемоника команды, которую необходимо выполнить; N1 - число в пределах от 1 до 32767 включительно; N2 - число в пределах от 1 до 32767 включительно; S1,S2 - строка не более чем из 20 символов. Запятая используется для разделения различных аргументов, хотя это можно изменить - см. команду "S". Пробелы игнорируются во всех случаях кроме тех, когда они находятся внутри строк. Никакой из аргументов не яв- ляется обязательным, хотя некоторые команды, например, команда "DELETE", не будут работать, если опущены аргументы N1 и N2. Редактор помнит ранее введенное число и строки и использует сформи- рованное значение для применения, если вы не определили другие значения внутри командной строки. 3.2. Команды редактора ====================== 3.2.1 Вставка текста ==================== Текст может быть введен в текстовый файл или указанием номера стро- ки, пробела и требуемого текста, или посредством команды "I". Заметим, что если сразу за номером строки вы введете , то эта строка будет удалена из текста, если, конечно он существует. Где бы не вводился текст, можно применять клавиши "<--", "-->" и (возврат к метке команды). Клавиша будет уничтожать предыдущий символ (но не далее на- чала строки текста). Текст вводится во внешний буфер внутри GENS4 и вы должны оградить его от переполнения использованием клавиш или "<--" для освобож- дения свободного пространства. Если во время ввода текста редактор опре- делит, что конец текста перекрывает вершину адресуемой памяти, то выда- ется сообщение . Это показывает, что далее текст вводить нельзя и что текстовый файл или последняя его часть должна быть сохранена на кассете для дальнейшего восстановления. Команда " I N,М " ================= Использование этой команды переводит ввод в автоматический режим: вам подсказываются номера строк, начиная с N с приращением м на каждом шагу. После высвечивающегося номера вы вводите нужный текст, по желанию используя нужные клавиши, и завершаете строку текста вводом . Для выхода из этого режима используется . Если вы вводите строку с уже существующим номером, то строка текста с этим номером удаляется и заменяется на вновь введенную после нажатия . Если автоматическое увеличение номера строки дает значение, большее 32767, то происходит автоматический выход из режима ввода. Если при вводе текста вы добрались до конца строки на экране, но еще не ввели 64 символа (размер буфера), то экран сдвинется вверх на одну строку и вы можете продолжать ввод со следующей строки - номер строки ав- томатически будет соответствовать введенному тексту. 3.2.2 Распечатка текста ======================= Текст может быть проверен с помощью команды "L"; номер строки, постоянно отображаемый при выполнении данной команды, устанавливается за- ранее, но он может быть изменен с помощью команды "К". Команда " L N,М " ================== Эта команда выводит листинг со строки N до строки М включительно на терминал. По умолчанию N присваивается значение 1, М - 32767, т.е. Значе- ниями по умолчанию не являются ранее введенные аргументы. Для листинга целого файла просто используйте команду "L" без аргу- ментов. Строки на экране форматируются по левой границе экрана, так что номер строки отображается ясно. Строка протабулирована автоматически, в результате чего получаем четкое разделение полей в строке. Номер отобра- жаемой на экране строки может быть проконтролирован с помощью команды "K" - после листинга определенного количества строк листинг будет приостанов- лен (даже если это еще не строка м). Для возврата в точку входа в редак- тор нажмите клавишу или любую другую клавишу для продолжения. Команда " K N " =============== "K" устанавливает количество экранных линий, которые должны отобра- жаться на терминале перед паузой, как это было описано выше (см. команду "L"). Значение N (не более 256) хранится в памяти. Например, если вы хо- тите при последующем использовании "L" выдавать на экран по 5 строк, то введите команду "К5". 3.2.3 Редактирование текста =========================== Однажды созданный текст неизбежно будет нуждаться в редактировании некоторых строк. В GENS4 имеются команды, позволяющие исправлять, сти- рать, перемещать и перенумеровывать строки. Команда " D [N,М] " =================== Все линии от N до М включительно удаляются из текстового файла. Если М. Команда " М N,М " ================= Эта команда помещает текст строки с номером N в строку М, уничтожая текст, уже существующий там. Т.е. эта команда позволяет вам перемещать строку текста внутри текстового файла. Если строки с номером N не сущест- вует, то команда игнорируется. Команда " N [N,М] " =================== Команда "N" перенумеровывает М строк текстового файла, начиная со строки N. N и М должны быть реальными и если номер линии превышает 32767, то остается первоначальная нумерация. Команда "F N,М,F,S " ==================== Текст со строки N до строки м исследуется на появление строки F. Если такая строка найдена, то она отображается на терминале и включается режим "EDIT" (см. ниже). Вы можете использовать команды внутри режима EDIT для нахождения последующих появлений строки F в пределах определенной области строк или для замещения строкой S текущего появления строки F и затем продолжить поиск строки F. Отметим, что диапазоны строк F и S могут быть установлены ранее другой командой, так что возможно вводить только F для инициализа- ции поиска (см. пример в разделе 3.3). Команда " Е N " =============== Редактирует строку с номером N. Если строки N не существует, то ко- манда игнорируется; в противном случае строка копируется в буфер и отоб- ражается на терминале вместе с номером строки. Номер строки вновь отобра- жается под строкой и включается режим редактирования. Все последующее ре- дактирование происходит внутри буфера, а не внутри самого текста, так что первоначальная строка может быть получена в любой момент. В этом режиме курсор отображается движущимся по строке (начиная с первого символа) поддерживая различные подкоманды, позволяющие редактиро- вать строку. В вашем распоряжении имеются следующие подкоманды: - перемещает курсор на одну позицию к следующему символу в стро- ке. Вы не можете шагнуть на конец строки. - возвращает курсор на предыдущий символ в строке. Невозможно шагнуть левее первого символа строки. < --> > - перемешает курсор на следующую позицию табуляции в каждой эк- ранной строке. - конец редактирования данной строки. Сохраняет все сделанные изменения. - выход из режима редактирования данной строки, т.е. Покидание редактируемой строки с игнорированием всех сделанных измене- ний. Строка остается такой же как она и была до редактирова- ния. - перезагружает буфер редактирования текстом, т.е. Забывает все сделанные в строке изменения и восстанавливает строку в перво- начальном виде. - распечатывает остаток строки, который должен быть отредактиро- ван, т.е. остаток строки за текущей позицией курсора. Вы оста- етесь в режиме редактирования с указателем, перепозициониро- ванным в начало строки. <К> - уничтожает символ в указываемой курсором позиции. - уничтожает все символы, начиная с указанного курсором и до конца строки. - ищет следующее появление строки "F",ранее определенной в ко- мандной строке (см. команду "F" выше). Эта подкоманда будет автоматически выводить систему из режима редактирования теку- щей строки (сохраняя все изменения) даже если цепь символов "F" в текущей строке не встретилась. Если цепочка "F" встрети- лась в последующих строках текста внутри первоначально опреде- ленного диапазона, то будет включен режим редактирования для строки, в которой найдена заданная последовательность символов "F". Отметим, что курсор всегда устанавливается в начало най- денной строки. - замещает ранее определенной строкой "S" текущее появление цепи символов "F" и затем выполняет подкоманду "F", т.е. Осущест- вляет поиск следующей строки "F". Так, вместе с вышеупомянутой командой "F" она используется для пошаговой замены строк сим- волов "F" строками "S". см. Раздел 3.3 для примера. - вводит символ в указанную курсором позицию. Вы будете оста- ваться в этом режиме до тех пор, пока не нажмете . По этой клавише вы возвращаетесь в основной режим редактирования с указывающим на последний введенный символ. Используя внутри этого режима, вы уничтожите символ в буфере слева от курсора, тогда как, используя < --> > переместите курсор в следующую позицию табуляции, включая пробелы внутри буфера. <Х> - перемещает курсор в конец строки и включает описанный подре- жим. <с> - изменяет подрежим. Это позволяет перезаписать символ в текущей позиции, затем передвигать курсор через одну позицию. Вы оста- нетесь в измененном подрежиме до тех пор, пока не нажмете кла- вишу , нажатие которой возвратит вас в основной режим редактирования с курсором, указывающим на последний измененный символ. просто сдвигает через одну позицию курсор влево, а < --> > не имеет эффекта. 3.2.4 Команды дисковода и магнитной ленты ========================================= Текст может быть сохранен на магнитной ленте/дисководе или загружен с них с помощью команд Р,Q и Т. Объектный код может быть сохранен на маг- нитной ленте с использованием команды О. Имена файлов не должны содержать более 10 символов. Команда " Р N,М,S " ==================== Строки с номерами от N до М сохраняются на ленте/диске в файле с именем, заданным строкой S. Текст будет записан на диск, если перед име- нем файла через двоеточие стоит номер дисковода. Помните, что эти аргу- менты могут быть установлены предыдущей командой. Примеры: Р 10,200,EXAMPLE - записать линии 10...200 на магнитофон в файл с именем "EXAMPLE". Р 500,900,1:TEST - записать линии 500...900 на дисковод 1. Перед введением этой команды убедитесь, что ваш магнитофон включен в режим записи. Не используйте эту команду, если вы желаете на последующей стадии ввести текст с ленты. Вместо этого используйте команду Т. Если вы намерены вводить текст с дисковода, то используйте команду Р. Если вы заносите на диск файл с уже имеющимся на диске именем, то вас спросят: FILE EXIST DELETE (Y/N)? (существующий файл удалять?) отвечайте "Y" для удаления файла и продолжения записи или нажмите любую другую клавишу для возврата в редактор без записи файла. Команда " G,,S " ================ На ленте или дискете производится поиск файла с именем "S". Когда файл найден, он загружается в конец текущего текста. Если строка "S" пустая, то загружается первый файл с кассеты. Для дисковода обязательно надо указать имя файла и номер дисковода. При работе с кассетой, после того как вы ввели команду "G", появится сообщение: START TAPE Вы должны нажать клавишу "воспроизведение" своего магнитофона. Ве- дется поиск файла с указанным именем или первого файла по умолчанию. Ког- да нужный файл найден, появится сообщение: USING FILENAME В противном случае высветится сообщение: FOUND FILENAME и поиск на ленте продолжается. При использовании дисковода и в том слу- чае, если не найден искомый файл, то появится сообщение "ABSENT". Заметим, что если в памяти уже находится текстовый файл, то файл, загружаемый с ленты, будет добавлен к существующему и строки всего сово- купного файла будут перенумерованы, начиная с первого с шагом 1. Команда " Т N,М,С " =================== Выводит блок текста между строками N и М включительно на ленту в формате, подходящем для дальнейшей работы под управлением директивы ассемблера *F - см. Раздел 2.9. Обрабатывается файл с именем "S". Вывод начинается сразу после нажатия клавиши , так что вы должны убе- диться, что ваш магнитофон готов к записи перед вводом этой командной ли- нии. Если вы намерены осуществлять ввод с дисковода, то используйте лучше команду "P", а не "T". Отметим, что эта команда должна использоваться только в том случае, если вы хотите позднее ассемблировать текст с ленты. Это неприменимо для диска - только в версиях DEVPAC 4. Команда " О,S " ================ Выводит ваш объектный код на кассету или дисковод. Имя файла может иметь длину более 8 символов и должно начинаться с номера привода (1...8) и двоеточия, если вы хотите сохранить объектный код на дискете. Только последний блок кода, произведенный ассемблером, может быть сохранен этим способом, т.е. если у вас более одной директивы "ORG" в исходной программе, то сохранится только код, произведенный после послед- ней директивы "ORG". Код должен быть получен в памяти перед тем, как он может быть сохра- нен с помощью команды "O". Часто удобнее использовать команду "А,,FILENAME" для автоматического получения файла. Эта команда работает быстрее "O" - см. ниже. 3.2.5 Ассемблирование и запуск из редактора =========================================== Команда " А О,S,F " ==================== Эта команда ассемблирует текст с первой строки текстового файла. Ко- манда "O" позволяет вам задать ключи, которые должны использоваться во время этой трансляции. Обычно достаточно использовать значения ключей по умолчанию, просто употребляя запятые. S - дает возможность изменить размер таблицы символов для этой трансля- ции. Размер таблицы по умолчанию обычно бывает достаточным, за исклю- чением режима ввода (INCLUDING). F - имя файла, имеющегося на дискете. Имя файла должно начинаться с , где D - номер дисковода, на котором размещен файл. Имя файла не долж- но содержать более 10 символов. Присутствие имени файла здесь побуж- дает ассемблер производить трансляцию иным способом. Вместо простого ассемблирования объектного кода в память и остановки по достижении вершины памяти, ассемблер не будет транслировать в память до тех пор, пока не достигнет ее вершины (верхнюю границу памяти вы може- те установить командой "U") и затем полученный объектный код будет сохра- нен на диске в указанном вами файле. Затем ассемблирование будет вновь продолжено с нижних адресов памяти и этот процесс будет продолжаться до тех пор, пока вся программа не будет проассемблирована и сохранена на дискете. Не существует ограничений на размер программы, которую вы хотите проассемблировать (кроме размера существующего пространства на вашей дискете (кассете)). Пара важных замечаний относительно использования директивы "ORG" для данных средств: 1 - директива "ORG" будет помещать объектный код по адресам, указанным в данной директиве первоначально и каждый раз после помещения объект- ного кода в объектный файл (если не был указан ключ 16, чтобы по- местить объектный код сразу после таблицы символов). Следовательно, ключ 16 более разумно использовать будет в том случае, когда ассемб- лирование происходит прямо на дискету, т.к. это дает максимальный размер для вашего буфера объектного кода; рабочие адреса вашего кода не будут поражены. 2 - вы должны избегать использования более одной директивы "ORG" в вашей программе, если только вы не введете нули в память между двумя этими директивами с помощью "DЕF". Например: ORG 50000 ; некоторые коды RET ORG 60000 ; еще коды Этот фрагмент не будет сохранен на ленте правильно, т.к. вторая ди- ректива "ORG" переопределяет начало буфера объектного кода. Но: ORG 50000 ; некоторые коды RET ; добиваем нулями до 60000 DEFS 60000-$ ; еще коды Фрагмент будет сохранен правильно, т.к. DEF- произведет достаточное количество нулей, чтобы последующий код начинался с адреса 60000. Очевидно, это неэффективно применительно к качеству кода, сохраняе- мого на дискете, но простота этого действия сохраняет ассемблер небольшим и быстрым. Примеры использования команды "A": а20,,1:TEST ассемблирует с листингом, помещает объектный код сразу после таблицы сим- волов (это увеличивает размер буфера объектного кода в памяти), использу- ет размер таблицы символов по умолчанию и сохраняет объектный код на дисководе 1 под именем "TEST". А,3000 ассемблирует программу, используя ключи по умолчанию, с размером таблицы символов 3000 байт. см. Раздел 2 для дальнейшей детализации того, что мо- жет случиться при ассемблировании. Команда "R" =========== Если исходная программа была проассемблирована без ошибок и рабочие адреса были определены с помощью директивы "ENT", то может быть использо- вана команда R для выполнения объектной программы. Объектная программа может использовать инструкцию RET (С9) для возврата в редактор сколько угодно раз если стек в конце выполнения программы будет таким же, каким он был в ее начале. Заметим, что директива "ENT" не будет действовать, если для ассемб- лирования использовался ключ 16. Прерывания перед вводом кода разрешены и регистр IY загружен значе- ниями 5С3А, важным для подпрограммы обслуживания прерываний SPECTRUM ROM. 3.2.6 Другие команды ==================== Команда "В" =========== Просто возвращает управление операционной системе. Для перезапуска ассемблера используйте RANDOMIZE USR XXXXX , где: XXXXX - адрес, с которого был загружен GENS4. Команда "C" =========== Позволяет вам изменить размер входного буфера и буфера макроопреде- лений (только для версий DEVPAC на магнитной ленте). Входной буфер - это буфер, в котором содержится текст, когда про- исходит трансляция непосредственно с кассеты или дискеты - чем больше этот буфер, тем больший текст может быть считан с кассеты или дискеты и, следовательно, тем быстрее будет происходить трансляция. Но, с другой стороны, используется большая память. Однако возможен компромисс между скоростью трансляции и используемой памятью, команда "C" позволит вам уп- равлять этим процессом, предоставляя вам возможность установки размера входного буфера. Буфер макроопределений используется для хранения текста макроопреде- лений, которые вы могли использовать. Команда "C" печатает подсказку на ввод размера входного буфера, а за- тем - на ввод размера буфера макроопределений. В обоих случаях вводить надо просто число десятичное байтов, которое вы желаете зарезервировать, и . Если вы нажали без ввода числа, то операция игнориру- ется. Определяемый вами размер входного буфера не должен быть менее 256 байт. Вы можете прервать команду с помощью 1. Отметим, что для дисковых версий DEVPAC 4, вы можете менять только размер буфера макроопределений. Команда "C" не уничтожает ваш текст, она просто сдвигает его вверх и вниз в памяти в зависимости от размера буфера. Лучше зарезервировать бу- феры такого размера, который будет нужен в начале сеанса. Команда " S,,D " ================= Эта команда позволяет вам изменить символ-разделитель аргументов в командной строке. На входе редактора таким разделителем является запятая, это может быть изменено с помощью команды "S" на первый символ определяю- щей строки "D". Помните, что однажды определив новый разделитель, вы должны его использовать до тех пор, пока не определите новый - даже внутри команды "S". Заметьте, что разделителем не может быть пробел. Команда " U N " ================ Позволяет установить верхнюю границу памяти равной N. Если N не ука- зать (т.е. ввести только U и ), то отображается текущая верхняя граница памяти. GENS4 не позволяет вашему текстовому файлу или объектному коду расп- ространяться выше верхней границы памяти и будет выдавать сообщение об ошибке при приближении к этой границе. По умолчанию верхняя граница памяти принимается равной вершине стека памяти системы SPECTRUM. Команда " V " ============== Выдает на дисплей полезную информацию: значение параметров команды N1 и N2 по умолчанию; символ-разделитель команды по умолчанию; десятичное значение начала и конца текста и значение первой командной строки S1. Команда " W N,М " ================== Выводит строки текста с N по М включительно на принтер. Если ни N, ни М не указаны, то будет напечатан весь файл. Печать будет приостановле- на после вывода некоторого числа линий, определенного командой "K" - наж- мите любую клавишу для продолжения печати. Команда " Х N " ================ Выдает каталог диска. В версии с 51-м символом перед выдачей катало- га происходит очистка экрана. Каталог всегда распечатывается в строку из 32-х позиций. Команда " Z " ============== Эффективно уничтожает весь ваш текст, но перед этим она спрашивает, уверены ли вы в необходимости этого. Отвечайте "Y" для уничтожения текста. Кроме быстрого уничтожения командой D1,32767 команда "Z" позволяет вам очистить ваш текстовый файл, если он каким-либо образом был испорчен. Команда "Z" устраняет необходимость для стартовой точки входа GENS4. Команда " Н " ============== Выдает подсказку на экран: список возможных команд в 2 столбца с заглавной буквой, обозначающий команду и отображающий текущее значение определенных важных параметров. 3.3 Пример использования редактора. =================================== Предположим, что вы ввели следующую программу (используя I10,10): 10 *Н 16 BIT RANDOM NUMBERS 20 30 ;INPUT: HL CONTAINS PREVIOUS RANDOM NUMBER 40 ;OUTPUT: HL CONTAINS NEW RANDON OR SEED NUMBER 60 RANDOM PUSH AF ; SAVE REGISTERS 70 PUSH BC 80 PUSH HL 90 ADD HL,HL ; *2 100 ADD HL,HL ; *4 ................ ................ ................ 140 ADD HL,HL ; *64 150 PIP BC ; OLD RANDOM NUMBER 160 ADD HL,DE 170 LD DE,L1 180 ADD HL,DE 190 POP BC ; RESTORE REGISTERS 200 POP AF 210 REY эта программа содержит несколько ошибок: строка 40: вместо "RANDOM" набрано "RANDON"; строка 70: PUSH BC начинается с поля метки; строка 150: PIP вместо POP; строка 160: требуется комментарий (это не ошибка, а недостаток); строка 210: вместо REY должно быть RET. Также должны быть добавлены две команды ADD HL,HL между строками 140 и 150. Кроме того, BCE ссылки на пару регистров DE в строках 160...180 должны быть ссылками на BC. Для внесения этих исправлений мы должны вы- полнить следующее: F40,40,RANDON,RADOM затем подкоманду "S" е70 затем I (режим вставки),один пробел и I142,2 142 ADD HL,HL ; *128 144 ADD HL,HL ; *256 F150,150,PIP,POP затем подкоманду "S" е160 затем Х,2 пробела;*257 +L1 е160,180,DE,BC затем повторное использование подкоманды "S" е210 затем 2 пробела,С,Т N10,10 , чтобы перенумеровать TEKCT. Рекомендуем вам хорошенько проработать вышеприведенный пример, используя редактор. п р и л о ж е н и е 1. ======================= Коды ошибок и их значение. ========================== *ERROR*1 - ошибка в константе этой строки; *ERROR*2 - мнемоника не распознана; *ERROR*3 - утверждение плохо сформировано; *ERROR*4 - символ определен более 1 раза; *ERROR*5 - строка содержит неверный символ (т.е. ничего не значащий в данном случае); *ERROR*6 - один из операндов в строке - незаконный; *ERROR*7 - символ в строке является резервной инструкцией; *ERROR*8 - ошибочная пара регистров; *ERROR*9 - слишком много регистров в строке; *ERROR*10 - выражение, которое должно занимать не более 8 бит, занимает больше; *ERROR*11 - неверные инструкции JP(IX+N) и JP(IY+N); *ERROR*12 - ошибка в директиве ассемблера; *ERROR*13 - незаконная ссылка вперед, т.е. EQU ссылается на символ, кото- рый еще не был определен; *ERROR*14 - деление на ноль; *ERROR*15 - переполнение в операции умножения; *ERROR*16 - вложенное макроопределение; *ERROR*17 - этот идентификатор - не макро; *ERROR*18 - вложенный макровызов; *ERROR*19 - вложенный условный оператор; BAD ORG! - директива ORG работает с адресом, который может испортить GENS4, текстовый файл или таблицу символов. Управление возв- ращается в редактор. OUT OF TABLE SPACE - появляется во время первого прохода, если на таблицу символов выделено недостаточно памяти. Управление возвраща- ется редактору. BAD MEMORY! - нет места для ввода текста,т.е. Конец текста близок к вер- шине ОЗУ памяти. Вы должны спасти текущий текстовый файл или его часть. П р и л о ж е н и е 2. ======================= Резервирование слов, мнемоника и т.д. ===================================== Список резервных инструкций внутри GENS4. Эти символы не могут использоваться как метки, хотя они могут быть частью меток. Все резервные инструкции состоят из заглавных букв: А В С D Е Н L I R S AF AF' BC DE HL IX IY SP NC Z NZ М Р PE PO Ниже приводится список мнемоники Z80, директив ассемблера и его ко- манд. Они также должны состоять из заглавных букв. ADC ADD AND BIT CALL CCF CP CPD CPDR SPI CPIR CPL DAA DEC DI DJNZ EI EX EXX HALT IM IN INC IND INDR INI INIR JP JR LD LDD LDDR LDI LDIR NEG NOP OR OUTDR OTIR OUT OUTD OUTI POP PUSH RES RET RETI RETN PL RRA RLC RLCA RLD RR RLA RRC RRCA RRD RST SBC SCF SET SLA SRA SRL DEFB DEFM DEFS DEFW ELSE END ENT EQU IF ORG MAC ENDM *D *Е *Н *L *S *С *F *М П р и л о ж е н и е 3. ======================= Р а б о ч и й п р и м е р. =========================== Ниже приводится пример типичного сеанса работы с использованием GENS4. Если вы новичок по части использования ассемблерных программ или вы немного не уверены в том, как использовать ассемблер/редактор GENS4, то мы настоятельно советуем вам тщательно проработать этот пример. Лишний раз заметим, что означает, что вы должны нажать клавишу "ENTER" на клавиатуре. Цель примера: Написать и проверить программу целочисленного умножения, текст кото- рой должен быть сохранен на магнитной ленте, используя команду редактора "T" так, чтобы легко было включать ее в состав будущих программ с магнит- ной ленты. Последовательность работы: 1 - напишите программу умножения как подпрограмму и запишите ее на ленту, используя команду редактора "P", чтобы ее можно было легко восстано- вить во время сеанса при наличии ошибок. 2 - отладьте подпрограмму умножения, редактируя ее, если это необходимо. 3 - запишите отлаженную программу на ленту, используя команду "T" так, чтобы эта подпрограмма могла быть помещена с ленты в другие програм- мы. Перед стартом мы должны загрузить GENS4 в компьютер - делайте так: LOAD " " CODE 26000 чтобы загрузить ассемблер с адреса 26000. Затем введите: RANDOMIZE USR 26000 сейчас вы находитесь в режиме редактирования, т.е. компьютер готов для создания программ на ассемблере. 1-я стадия: запись программы целочисленного умножения. Мы используем команду редактора I, чтобы ввести текст, используя < --> > (символ табуляции) для получения табулированного листинга. Ниже мы не указываем, где используется табуляция. Но вы можете пред- положить, что табуляция используется между мнемоникой команды и между мнемоникой и операндом. Заметим, что адреса, показанные в ассемблерном листинге примера, который следует, могут не соответствовать полученным в вашем компьютере, они служат только для иллюстрации: >I10,10 10 ;а FAST INTEGER MULTIPLY 20 ;ROUTINE>MULTIPLIES HL 30 ;BY DE.RETURN THE RESULT 40 ;IN HL.С FLAG SET ON AN 50 ;OVERFLOW. 60 ; 70 ORG #7F00 80 90 MULT OR а 100 SBC HL,DE;HL>DE? 110 ADD HL,DE 120 JR NC,MU1;YES 130 EX DE,HL 140 MU1 OR D 150 SCF;OVERFLOW IT 160 RET NZ;DE>255 170 OR е;TIMES 0? 180 LD е,D 190 JR NZ,MV4;NO 200 EX DE,HL;0 210 RET 220 230 ;MAIN ROUTINE 240 250 MU2 EX DE,HL 260 ADD HL,DE 270 EX DE,HL 280 MDDO