Код:
4. ДИРЕКТИВЫ АССЕМБЛЕРА
ORG адрес[,страница]
Установка адреса компиляции. По умолчанию параметр "страница"
старый, в начале компиляции =0.
метка EQU значение
Присваивает метке значение, эквивалентное параметру "значение".
DISP адрес
Установка адреса, в котором должна работать программа.
ENT
Присвоение адресу работы программы текущего адреса компиляции.
Пример:
SCREEN EQU #4000
ORG #8000
LD HL,BEGIN ;Пересылка в область экрана
LD DE,SCREEN ;и запуск программы ожидания
LD BC,END-BEGIN ;[A] прерываний
LDIR
CALL SCREEN
DI
HALT
BEGIN DISP SCREEN
MARKA DEC A
HALT
JP NZ,MARKA ;JP не случайно
RET
ENT
END
Текущее смещение компиляции (shift=org-disp) узнают так:
a ORG 0
ENT
shift ORG a+shift
DISP a
INCLUDE "drv:имя файла"[,страница]
Включение в компилируемый файл дополнительного исходника,
лежащего на диске под именем "имя файла". При этом указанный
файл загружается в страницу, определенную параметром "страница"
(по умолчанию - текущая). По окончании компиляции включенного
блока компиляция продолжается со строки, следующей после данной
директивы. Файл не будет загружаться с диска, если
он уже находится в необходимой странице. "" - любой файл.
Пример:
LDIR
INCLUDE "TOKENIZE",1
OTDR
INCLUDE "ALASM2"
HALT
Сначала будет откомпилирован LDIR, потом текст "TOKENIZE.H",
загруженный в страницу 1, потом OTDR, затем в тек.страницу
будет загружен и откомпилирован текст "ALASM2.H", после чего
с диска будет считан основной файл и компиляция продолжится
с команды HALT.
MAIN "имя файла"[,страница]
Указание основного файла компиляции. Директива MAIN должна быть
первой исполнимой директивой подчиненного файла.
Символы "." и "*" заменяйте на "?".
Пример:
MAIN "MAKE6?7",6
LDIR
После подачи команды ASSEMBLE компиляция передается
программе MAKE6*7, находящейся в странице 6,
затем находящийся в ней INCLUDE вызывает подчиненную
программу, состоящую из директивы MAIN и команды LDIR.
Во включаемых файлах MAIN игнорируется, поэтому после
ассемблирования LDIR происходит возврат назад и
продолжение компиляции.
INCBIN "дисковод:имя файла"[,длина]
Включение в компилируемую программу кодового блока с диска
размером "длина" байт или по умолчанию из данных каталога.
DUP число
Указывает начало блока, который необходимо компилировать
"число" раз подряд
EDUP
Указывает конец повторяемого блока. Возможна вложенная
конструкция.
Пример:
DUP 32
LDI
LD A,B
OR C
JR Z,$+3
LD (HL),D
EDUP
Блок между DUP и EDUP откомпилируется 32 раза
REPEAT
<тело>
UNTIL <выражение>
Компилирует <тело>, пока <выражение> не 0
DB байт[,список байт]
Пример:
DB "У",13,10,"попа",13,10,"была",13,10,"собака",13,10
DEFB "она съела",13,10,"попа факу..."
DW слово[,список слов]
Пример:
DW ALASKA,BUFFER,12,#BD15,32767,.NUMB1
DEFW 12345,34567
DS количество повторений[,список байт]
Список байт (по умолчанию нулевой байт) копируется в текущий
адрес компиляции. Число циклов = "количество повторений".
Пример:
DS 10,#E5
DEFS 32,#ED,#B0
DD [#]hexбайт[hexбайты]
Плотное хранение шестнадцатиричных чисел.
DD 1D4FDC,4223
эквивалентно
DB #1D,#4F,#DC,#42,#23
+<нечто>
ОПАСНО ПРИ ДЛИНЕ СТРОКИ=#2C..#2F!
При загрузке текста с диска он сканируется на наличие в нем "+"
в начале каждой строки. В процессе компиляции все встреченные
"+" будут заменены на "-", что заставит компилятор пропускать
строки при следующем ассемблировании.
Пример:
LD HL,#DB00
+SAVEADR
+ ORG #DB00,7
+ INCBIN "sts70r"
+ ORG SAVEADR
JP (HL)
отладчик загрузится только при первой компиляции
метка=выражение
(Пере)присвоение значения метке.
Пример:
SHLUSS=0
ORG 32768
DUP #4000
DEFW SHLUSS
SHLUSS=SHLUSS+1
EDUP
память выше #8000 заполнится увеличивающимися словами 0..16384
IF <выражение>
<тело1>
ELSE
<тело2>
ENDIF
Если <выражение>=0, то компилируется <тело1>, иначе <тело2>
IFN <выражение>
<тело1>
ELSE
<тело2>
ENDIF
То же, но наоборот.
Допускается вложенность условной компиляции (до 254)
LOCAL
<тело>
ENDL
Объявление локальных меток. Все метки в пределах этой
операторной скобки будут невидимы вне ее (кроме меток,
начинающихся с символа @ - это глобальные метки). Допускаются и
вложенные конструкции.
Если в пределах локальных меток определять метки с именами,
к которым обращались раньше этой конструкции, то такие метки
будут глобальными:
LD HL,LABEL
LOCAL
LABEL
ENDL
MACRO <имя_макросa>
<тело>
ENDM
Определение макроса.
В теле макроса:
\0..\9 - параметр номер 0,1,2,..9
\C - текущий символ
\N - перейти на следующий символ (ничего не выдает)
\S<char> - строка от текущего символа до символа <char>
\P - сдвинуть строку параметров на один параметр. Выдает
съеденный параметр.
\R - отменяет все \P.
<имя_макроса> [параметр1[,параметр2[...]]]
Использовать макрос.
Разделитель параметров - запятая
(заключенная в кавычки не считается).
MACRO DOWN
LOCAL
INC \C
LD A,\C
AND 7
JR NZ,LABEL
LD A,\N\C
SUB #E0
LD \C,A
SBC A,A
AND -8
ADD A,\R\C
LD \C,A
LABEL
ENDL
ENDM
Теперь мы можем процедуры DOWN HL и DOWN DE компилировать по их
именам - DOWN HL, DOWN DE и т.д.
Пользуясь условиями типа
IF " "-"\1 "
или
IF ?macroname\1-2
можмо определять макросы с переменным числом параметров.
DISPLAY [/L,]["any text",][[/D|/H|/A,][/T,]выражение]
Отображает текст или числа в процессе ассемблирования. Ключи
/D, /H и /A устанавливают формат вывода для одного следующего
числа. Далее числа выводятся в текущей системе счисления. /D -
десятичное число, /H - шестнадцатиричное, /A - в обеих
системах.
/L указывает, что необходимо печатать не с новой строки.
/T выводит сначала само выражение, потом его значение.
Примеры:
DISPLAY "code size: ",/D,end-start
DISPLAY /A,"abc+xyz=",abc+xyz
DISPLAY "simple"," text"
DISPLAY "Баран жевал "
DISPLAY /L,"травКу"
DISPLAY /A,/T,abc+xyz
эквивалентно
DISPLAY /A,"abc+xyz",abc+xyz
<unknown token> адрес[,страница]
Вызывает во время трансляции указанную процедуру.
При этом Post-метки еще не рассчитаны, а ALASM лежит в #8000.
Половинки IX и IY: HX,HY,LX,LY.
Можно: INF;SLI;OUT (C),0;EXA;EXD;JZ;JNZ;JC;JNC
LD L,0,H,'fnt и т.п.
5. Выражения
Считаются слева направо без приоритетов (кроме скобок).
a+b
a-b
a*b
a/b
a&b - AND
a|b - OR
a!b - XOR
a>b - циклич.сдвиг слова a на b бит вправо
a<b - влево
() - скобки (сначала рассчитываются они)
{a} - слово, находящееся в памяти по адресу a
a~ - инвертирование текущего результата
?метка - возвращ. 0, если метка определена, #ffff, если не
определена, и 1, если не определена, но к ней было уже
обращение. Если метка - название макроса, то 2.
'a - ст.байт a
.a - мл.байт a
%const двоичная
$$ - текущая страница кода
Как узнать страничку компилируемого исходника
и адрес компилируемой строки (из макроса нельзя)
ORG #C0E1,2
DISPLAY {$}-#C040,"/pg",.{$+2}
Как определить, не из mkace ли мы запущены
ORG #FF32,2
IF {4>4+{$}}-#BF43
make ;mkace!
ENDIF
Во всех операциях, кроме + и -, не допускается использование
меток, которые будут определены ниже (из-за однопроходности)