
Сообщение от
CityAceE
Существует ли какой-нибудь метод, который позволяет автоматически развернуть все макросы, подставить все данные и удалить из несработавшие условия?
Если честно, вы немного... непонятно формулируете вопрос и свою задачу, мне она не очень понятна. Впечатление, что проблемы именно с формулированием.
Вызов макроса формирует код. В теле макроса у вас выполняются или не выполняются отдельные условия, формируется код, размещенный в сработавших ветвях, код из несработавших ветвей не формируется. Что значит "метод, который позволяет автоматически развернуть все макросы, подставить все данные и удалить из несработавшие условия"? Откуда чего вы хотите удалить?! Я вас не понимать.
Добавил:
Код:
DEVICE ZXSPECTRUM48
ORG 32768
A EQU 0
и в конце:
(А почему я это должен писать?!)
В итоге, все нормально скомпилировалось, ваш макрос при таком вызове macro_ld_reg_ix_d A,99-100,0 сформировал вот такой код:
Код:
PUSH HL
LD HL,(#8012) ; это адрес вашей переменной rIX
PUSH BC
LD BC,#FFFF ; это ваша минус единица, 99-100=-1
ADD HL,BC
POP BC
LD A,(HL)
LD (#8011),A ; это не то, что вы хотели, но таков ваш макрос:
;if reg == 0 ; A
; ld (.tmp + 1), a
;endif
; исправляйте его, если хотите что-то другое
POP HL
LD A,0 ; это тоже не то, что вам нужно, но... вы же это написали в макросе
И что вы хотите? Поконкретнее плз. Потому что

Сообщение от
CityAceE
А нужно, чтобы он развернулся, подставились все необходимые значения и убрались все несработавшие условия.
именно это и произошло.
- - - Добавлено - - -

Сообщение от
CityAceE
Вот так работает, но в итоге имеем лишних 7 байт на константы. Причём в конец кода их перекинуть нельзя, так как они должны находится перед первым вызовом макроса.
Какие константы? Это реальные байты. Я не понимаю, зачем использовать для этого реальные байты памяти... Есть переменные. Вон я пример привел с EQU, определил A. Можете теперь сравнивать с A, а не с нулем. Ну вообще конечно плохо пересекаться с именами регистров, но если очень уж хочется, то можно. Но зачем?!
Ну и я просто не вполне понимаю задачу, которую вы делаете. Я так понял, вы хотите реализовать инструкцию работы с индексным регистром, обходясь регистрами HL и BC, этим обеспечив совместимость с другим процессором без поддержки таких инструкций. Вы хотите какие-то исходники преобразовать в такой вот измененный код, переассемблировать, что-то куда-то портировать? На какую машину? Что и откуда вам нужно удалить?!
И да, вам очень правильно указали, что ADD влияет на флаги, в отличие от загрузки в память/из памяти по адресу из индексного регистра плюс-минус смещение, вам придется об этом позаботиться.
Регистры и регистровые пары логичнее было бы нумеровать так, как они пронумерованы в опкодах, чтобы затем по возможности по приходящему значению вычислять нужный опкод, а не городить многоэтажные IFы.