Мне интересно, может ли кто-нибудь помочь мне с раздражающей проблемой, с которой я сталкиваюсь, используя ассемблер VASM для компиляции двоичных файлов MC68000 для Amiga. Проблема заключается в глючной (как мне кажется) реализации манипуляций с адресами меток.
Вот подробности:
copper_scr:
dc.w $e0, (screen>>16) & $ffff
dc.w $e2, screen & $ffff
...
screen:
dcb.w screen_size ; screen_size value does not matter here
Что я пытаюсь сделать в приведенном выше коде, так это разделить экранный адрес на наиболее значимое слово и менее значимое слово, чтобы передать регистры чипа адресом данных экрана (или вектором, если хотите).
Однако компиляция кода в этой форме дает мне ошибку 39 «незаконное перемещение».
Я испробовал много способов избавиться от этого, так как предполагал, что, поскольку адрес экрана длинный (т.е. не слово), результат «экран >> 16» может остаться длинным, и поэтому я не могу поместить такое значение в место для всего слова.
Что интересно, следующий код компилируется без ошибок, но оба значения в результирующем двоичном файле компилируются в значение 0:
...
dc.w $e0,0 + screen>>16 & $ffff
dc.w $e2,0 + screen&$ffff
...
В качестве временного грязного обходного пути я вычисляю эти значения во время выполнения где-то в начале кода:
move.l #screen,a0
move.l a0,d7
lsr.l #4,d7
lsr.l #4,d7
lsr.l #4,d7
lsr.l #4,d7
andi.l #$ffff,d7
move.w d7,copper_scr+2
move.l a0,d7
andi.l #$ffff,d7
move.w d7,copper_scr+6
но это, очевидно, смешно и совершенно неправильно.
Любая помощь приветствуется.