3.2.5.АССЕМБЛИРОВАНИЕ И ЗАПУСК ИЗ РЕДАКТОРА
• КОМАНДА "A O,S,F'
Эта команда ассемблирует текст с первой строчки текстового файла. Команда
"О" позволяет вам задать ключи, которые должны использоваться во время этой
трансляции. Обычно достаточно использовать значения ключей по умолчанию,
просто употребляя запятые.
S — дает возможность изменить размер таблицы символов для этой
трансляции. Размер таблицы по умолчанию обычно бывает достаточным, за
исключением режима ввода (INCLUDING).
F — имя файла, имеющегося на дискете. Имя файла должно начинаться с <D:>,
где D — номер дисковода, на котором размещен файл. Имя файла не должно
содержать более 10 символов. Присутствие имени файла здесь побуждает
ассемблер производить трансляцию иным способом.
Вместо простого ассемблирования объектного кода в память и остановки по
достижении вершины памяти, ассемблер не будет транслировать в память до тех
пор, пока не достигнет ее вершины (верхнюю границу памяти вы можете
установить командой "U") и затем полученный объектный код будет сохранен на
диске в указанном вами файле. Затем ассемблирование будет вновь продолжено с
нижних адресов памяти и этот процесс будет продолжаться до тех пор, пока вся
программа не будет проассемблирована и сохранена на дискете.
Не существует ограничений на размер программы, которую вы хотите
проассемблировать (кроме размера существующего пространства на вашей
дискете (кассете)).
Пара важных замечаний относительно использования директивы "ORG" для
данных средств:
1 — директива "ORG" будет помещать объектный код по адресам, указанным в
данной директиве первоначально и каждый раз после помещения объектного кода
в объектный файл (если не был указан ключ 16, чтобы поместить объектный код
сразу после таблицы символов). Следовательно, ключ 16 более разумно
использовать будет в том случае, когда ассемблирование происходит прямо на
дискету, т.к. это дает максимальный размер для вашего буфера объектного кода;
рабочие адреса вашего кода не будут поражены.
2 — вы должны избегать использования более одной директивы "ORG" в вашей
программе, если только вы не введете нули в память между двумя этими
директивами с помощью "DEF".
НАПРИМЕР:
ORG 50000
; некоторые коды
RET
ORG 60000
; еще коды
Этот фрагмент не будет сохранен на ленте правильно, т.к. вторая директива
"ORG" переопределяет начало буфера объектного кода. Но:
ORG 50000
; некоторые коды
RET
; добиваем нулями до 60000
DEFS 60000-$
; еще коды
Фрагмент будет сохранен правильно, т.к. DEF— произведет достаточное
количество нулей, чтобы последующий код начинался с адреса 60000.
Очевидно, это неэффективно применительно к качеству кода, сохраняемого на
дискете, но простота этого действия сохраняет ассемблер небольшим и быстрым.
Примеры использования команды "А".
А2 0 ,,l: TEST <ENTER>
Ассемблирует с листингом, помешает объектный код сразу после таблицы
символов (это увеличивает размер буфера объектного кода в памяти), использует
размер таблицы символов по умолчанию и сохраняет объектный код на дисководе
111 ■ I ■ Т"1 о ■ I 1II
под именем "TEST".
А,3000 <ENTER>
Ассемблирует программу, используя ключи по умолчанию, с размером таблицы
символов 3000 байт. см. раздел 2 для дальнейшей детализации того, что может
случиться при ассемблировании.
• КОМАНДА "R".
Если исходная программа была проассемблирована без ошибок и рабочие
адреса были определены с помощью директивы ENT", то может быть использована
команда R для выполнения объектной программы. Объектная программа может
использовать инструкцию RET (C9) для возврата в редактор сколько угодно раз
если стек в конце выполнения программы будет таким же, каким он был в начале.
Заметим, что директива "ENT" не будет действовать, если для ассемблирования
использовался ключ 16.
Прерывания перед вводом кода разрешены и регистр IY загружен значениями
5СЗА, важным для программы обслуживания прерываний SPECTRUM ROM.
3.2.6. ДРУГИЕ КОМАНДЫ/
• КОМАНДА "В"
Просто возвращает управление операционной системе. Для перезапуска
ассемблера используйте
RANDOMIZE USR ХХХХХ,
Где: ХХХХХ — адрес, с которого был загружен GENS4.
• КОМАНДА "С"
Позволяет вам изменить размер входного буфера и буфера макроопределений
(только для версий DEVPAC на магнитной ленте).
Входной буфер — это буфер, в котором содержится текст, когда происходит
трансляция непосредственно с кассеты или дискеты — чем больше этот буфер, тем
больший текст может быть считан с кассеты или дискеты и, следовательно, тем
быстрее будет происходить трансляция. Но, с другой стороны, используется
большая память. Однако возможен компромисс между скоростью трансляции и
используемой памятью, команда "С" позволит вам управлять этим процессом,
предоставляя вам возможность установки размера входного буфера.
Буфер макроопределений используется для хранения текста
макроопределений, которые вы могли использовать.
Команда "С" печатает подсказку на ввод размера входного буфера, а затем —
на ввод размера буфера макроопределений. В обоих случаях вводить надо просто
число десятичное байтов, которое вы желаете зарезервировать, и <ENTER>. Если
вы нажали <ENTER>, без ввода числа, то операция игнорируется. Определяемый
вами размер входного буфера не должен быть менее 256 байт. Вы можете прервать
команду с помощью <CAPS SHIFT> 1.
Отметим, что для дисковых версий DEVPAC 4, вы можете менять только размер
буфера макроопределений.
Команда "С" не уничтожает ваш текст, она просто сдвигает его вверх и вниз в
памяти в зависимости от размера буфера. Лучше зарезервировать буферы такого
размера, который будет нужен в начале сеанса.
• КОМАНДА "S,,D"
Эта команда позволяет вам изменить символ-разделитель аргументов в
командной строке. На входе редактора таким разделителем является запятая, это
может быть изменено с помощью команды "S" на первый символ определяющей
строки "D".
Помните, что однажды определив новый разделитель, вы должны его
использовать до тех пор, пока не определите новый — даже внутри команды "S".
Заметьте, что разделителем не может быть пробел.
• КОМАНДА "UN"
Позволяет установить верхнюю границу памяти равной N, Если N не указать
(т.е. ввести только U и <ENTER>), то отображается текущая верхняя граница
памяти.
GENS4 не позволяет вашему текстовому файлу или объектному коду
распространяться выше верхней границы памяти и будет выдавать сообщение об
ошибке при приближении к этой границе.
По умолчанию верхняя граница памяти принимается равной вершине стека
памяти системы SPECTRUM.
• КОМАНДА "V"
Выдает на дисплей полезную информацию: значение параметров команды N1 и
N2 по умолчанию; символ-разделитель команды по умолчанию; десятичное
значение начала и конца текста и значение первой командной строки S1.
• КОМАНДА "WN,M"
Выводит строки текста с N по М включительно на принтер. Если ни N, ни М не
указаны, то будет напечатан весь файл. Печать будет приостановлена после вывода
некоторого числа линий, определенного командой "К" — нажмите любую клавишу
для продолжения печати.
• КОМАНДА "XN"
Выдает каталог диска. В версии с 51-м символом перед выдачей каталога
происходит очистка экрана. Каталог всегда распечатывается в строку из 32-х
позиций.
• КОМАНДА "Z"
Эффективно уничтожает весь ваш текст, но перед этим она спрашивает
уверены ли вы в необходимости этого. Отвечайте "Y" для уничтожения теста.
Кроме быстрого уничтожения командой D 1,32767 команда "Z" позволяет вам
очистить ваш текстовый файл, если он каким-либо образом был испорчен. Команда
"Z" устраняет необходимость для стартовой точки входа GENS4
• КОМАНДА "Н"
Выдает подсказку на экран: список возможных команд в 2 столбца с заглавной
буквой, обозначающий команду и отображающий текущее значение
определенных важных параметров.
3.3.ПРИМЕР ИСПОЛЬЗОВАНИЯ РЕДАКТОРА
Предположим, что вы ввели следующую программу (используя I10,10):
10 ;Н 16 BIT RANDOM NUMBERS
20
3 0 ;INPUT:HL CONTAINS PREVIOUS RANDOM NUMBER
4 0 ; OUTPUT :HL CONTAINS NEW RANDON OR SEED NUMBER
50
60 RANDOM PUSH AF ; SAVE REGISTERS
7 0 PUSH ВС
80 PUSH HL
90 ADD HL,HL . ; *2
100 ADD HL,HL ; *4
140 ADD HL,HL ; *64
150 PIP ВС ; OLD RANDOM NUMBER
160 ADD HL,DE
17 0 LD DE,L1
180 ADD HL,DE
190 POP ВС ; RESTORE REGISTERS
200 POP AF
210 REY
Эта программа содержит несколько ошибок:
Строка 40: Вместо "RANDOM" набрано "RANDON";
Строка 70: PUSH ВС начинается с поля метки;
Строка 150: PIP вместо POP;
Строка 160: Требуется комментарии (это не ошибка, а не достаток);
Строка 210: Вместо REY должно быть RET.
Также должны быть добавлены две команды ADD HL,HL между строками 140 и
150. Кроме того, все ссылки на пару регистров DE в строках 160... 180 должны быть
ссылками на ВС.
Для внесения этих исправлений мы должны выполнить следующее:
F4 0,4 0,RANDOM <ENTER>
затем подкоманду "S"
Е7 0 <ENTER>
затем I (режим вставки), один пробел и <ENTER><ENTER>
I142,2<ENTER> 142 ADD HL,HL ; *128
144 ADD HL,HL ; *256
<EDIT>
F150,150,PIP,POP <ENTER>
затем подкоманду "S"
E160 <ENTER> затем Х,2 пробела; *257 +L1
<ENTER><ENTER> E16 0,180,DE,BC <ENTER>
затем повторное использование подкоманды "S"
Е210 <ENTER> затем 2 пробела, С, Т <ENTER><ENTER> N10,10
<ENTER>
чтобы перенумеровать текст.
Рекомендуем вам хорошенько проработать вышеприведенный пример,
используя редактор.
Коды ошибок и их значение.
*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! — нет места для ввода текста, т.е. конец текста близок к
вершине ОЗУ памяти. Вы должны спасти текущий текстовый файл или его часть.