Сообщение от
Higgins
1) Надо понимать так, что весь макропроцессор написан через вызовы эмулятора? То есть, непосредственно языком поддерживается только сама возможность определения и использования макросов, но не их раскрытия?
Нет ... Макропроцессор написан как простоя подмена входных параметров нужными значениями. Именно поэтому нужно писать 0+LOW(xxx), что бы компиллер понял, что это не макрос а цикл, восприняв первый "0" как число. Вообщем макросы раскрываются только в виде подставляемых в них параметров. Простая замена, а уже потом компилятор разбирает это число или команда или ещё один макрос ...
Сообщение от
Higgins
2) Эти вызовы эмулятора происходят на каждом проходе? Если да, то с какими значениями меток, в том числе $, если раскрытие макроса зависит от этих значений?
Да, на каждом проходе ... Отличие только в окончании ne ... RunEmulZX запустит в любом случае, а RunEmulZXne, только если нет ошибок компиляции ...
Сообщение от
Higgins
Как в этом случае будут вычисляться значения меток? Или во время трансляции мы должны получить ошибку?
В этом случае будет зацикливание ... Что бы этого не было, нужно сделать так:
Код:
ORG #8006-(END-START)
START DB "ABC"
.0+LOW($/#8000)
DB "X"
..
DB "DEF"
EQU END=$
SaveBIN "TEST.BIN",START,END-START
Зацикливание будет только в случае адреса #8003. Поскольку длина кода будет меняться от адреса куда попадает "Х" !!!
Эта строчка: "EQU END=$", нужна, что бы метка END была удалена после первого прохода. Таким образом ты объясняешь компилятору, что эта метка точно используется в тексте и не нужно её контролировать на наличие использования. В таком случае не будет ошибки и не будет зацикливаний ...
---------- Post added at 14:29 ---------- Previous post was at 14:16 ----------
Сообщение от
Higgins
параметры макросов обозначаются этими странными значками?
Да - точно ... Я специально выбрал не использованный символ для входного параметра в макрос. А значёт вконце макроса (галочка в дос кодировке), эозначает, что всякие параметры далее запрещены, и если вдруг строчка вызываемая макрос их содердит, ты получишь ошибку. Так же можно создать макрос без значков и окончания. Тогда компилятор через запятую воспримет 10-ть значений макроса.
Например:
Код:
.HELLO
@.0
@.1
@.2
@.3
..
Далее вызываем макрос:
HELLO NOP, POP, LDIR
То есть компилятор первый параметр макроса поймёт как NOP, второй POР, третий LDIR, а четвёртый как пустая строчка. Конечно же в этом случае нужно помнить, что нельзя передать, например - "LD HL,16384", поскольку разделитель есть запятая ... Если нужно передавать более сложные параметры макроса, то лучше иначе его описать и придумать другие разделители.
---------- Post added at 14:37 ---------- Previous post was at 14:29 ----------
Сообщение от
Higgins
То есть, сам ассемблер непосредственно сравнения и другие операции не поддерживает?
Не поддерживает. Чтобы описать 100% IF, тебе нужно писать все вариации IF'ов ... Это не язык высокого уровня и вложенность не поддерживает. То есть в макрос нельзя передать раскрытый макрос прямым путём ! Нелзья сделать макрос ABS(A) и его передать в IF (ABS(A)<0). Отдельно нужно получить значение из ABS и отдельно его передать в IF !