Вопрос по ASMX - никто не сталкивался с проблемой того, что для компиляторов нового поколения, которыми ASMX собирается из исходников, тип int расширен уже до 32 бит? Из-за этого в моём модуле поддержки семейства SH бьются джампбэки (в частности, функции BRA, BSR и т.д.).
#define LIMIT 0xFFF
<...>
int EvalShift(short size)
{
int val;
val = Eval();
val = val - locPtr - 4;
if (!errFlag && (((size==1) && (val & 1)) || ((size==2) && (val & 3)) || val < ~LIMIT || val >= LIMIT))
Error("Long branch out of range");
val = val >> size;
return val;
}
<...>
case o_Branch:
oldLine = linePtr;
if (GetWord(word) == '/')
{
if(curCPU<CPU_SH2||(parm!=0x8B00&&parm!=0x8900)) break;
if (Expect("S")) break;
parm=parm|0x400;
}
else linePtr = oldLine;
val = EvalShift(1);
if (!errFlag&&(parm!=0xA000&&parm!=0xB000)&&(val < -128 || val > 127)) Error("Offset out of range");
InstrW(parm|val);
break;Если при вычислении первичного оффсета число получается 32-битным, то 16-битное -$fff с 32-битной точки зрения остаётся числом положительным, и тогда ошибка Long branch out of range не срабатывает. По итогу единицы разрядами старше 12 наслаиваются на коммандообразующую часть опкода.
Пробовал сменить тип val на short - делу вообще не помогло: отрицательный результат так и остался 32-битным (как показало введённая временно чисто с целью дебага сообщение
printf("Destination is %x\n",val); следующей за
val = val - locPtr - 4; строкой).
Собирал я ASMX, если что, с помощью
сборки MSYS64 от
MAME Team, проапдейченной по их же методу:
pacman -Sy
pacman -S bash pacman msys2-runtime --noconfirm --needed
pacman -Su --noconfirm